cvs: php-gcov-web(SOC06) /www config.php index.php post.php site.api.php style.css tags.inc viewer.php /www/downloads
PHP_4_4-gcov-20060810.diff.txt.bz2 genhtml.gcov-php-net lcov-1.5-pre1.noarch.rpm lcov_1.5-1_all.deb

From: Date: Mon, 21 Aug 2006 04:06:41 +0000
Subject: cvs: php-gcov-web(SOC06) /www config.php index.php post.php site.api.php style.css tags.inc viewer.php /www/downloads
PHP_4_4-gcov-20060810.diff.txt.bz2 genhtml.gcov-php-net lcov-1.5-pre1.noarch.rpm lcov_1.5-1_all.deb
Groups: php.mirrors 
Request: Send a blank email to php-mirrors+get-32206@lists.php.net to get a copy of this message
pronych Mon Aug 21 04:06:41 2006 UTC Added files: (Branch: SOC06) /php-gcov-web/www/downloads PHP_4_4-gcov-20060810.diff.txt.bz2 genhtml.gcov-php-net lcov-1.5-pre1.noarch.rpm lcov_1.5-1_all.deb Removed files: /php-gcov-web/www tags.inc Modified files: /php-gcov-web/www config.php index.php post.php site.api.php style.css viewer.php Log: Website now displays user submitted data, both tags and database connection are shared between cron and database scripts

http://cvs.php.net/viewvc.cgi/php-gcov-web/www/config.php?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-gcov-web/www/config.php diff -u php-gcov-web/www/config.php:1.1.2.2 php-gcov-web/www/config.php:1.1.2.3 --- php-gcov-web/www/config.php:1.1.2.2 Tue Aug 8 18:23:47 2006 +++ php-gcov-web/www/config.php Mon Aug 21 04:06:41 2006 @@ -1,34 +1,24 @@ <?php +/* +// Project: PHP QA GCOV Website +// File: Core Site Configuration File +// Desc: contains core site settings, this file is essential and always included by the API. +*/ + // Set up the key variables $appvars = array(); // Application variables array $appvars['site'] = array(); // Application site-specific variable array $appvars['page'] = array(); // Application page-specific variable array -// todo: should mytag be considered site-specific or page-specific? -//$appvars['site']['tags'] = array('PHP_4_4', 'PHP_5_1', 'PHP_5_2', 'PHP_HEAD'); -// Define the root directory of the scripts (todo: verify this is needed) -//$appvars['site']['basepath'] = '/var/www/gcov/'; - -$user = 'phpgcov'; -$pass = 'phpfi'; -$dsn = 'mysql:host=localhost;dbname=phpqagcov'; - -try -{ - $mysqlconn = new PDO($dsn, $user, $pass); -} -catch(PDOException $e) -{ - echo 'Error: '.$e->getMessage().'<br />'; - exit; -} - // Define the file that contains the text for each PHP version -$appvars['site']['phpvtags'] = 'tags.inc'; +$appvars['site']['tagsfile'] = '/home/quadra23/temp/phpqa/tags.inc'; + +// Define the file that contains all needed database connections +$appvars['site']['dbcsfile'] = '/home/quadra23/temp/phpqa/database.php'; // Define links for the side bar (used in site.api.php) - $appvars['site']['sidebarsubitems'] = array( +$appvars['site']['sidebarsubitems_localbuilds'] = array( 'coverage' => 'lcov', 'compile-results' => 'compile_results', 'graphs' => 'graph', @@ -36,3 +26,12 @@ 'test-failures' => 'tests', 'valgrind' => 'valgrind' ); + + // Define sidebar links that are active when viewing a builder's submissions +$appvars['site']['sidebarsubitems_otherplatforms'] = array( + 'compile-results' => 'compile_results', + 'system' => 'system', + 'test-failures' => 'tests', + 'valgrind' => 'valgrind' + ); + http://cvs.php.net/viewvc.cgi/php-gcov-web/www/index.php?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-gcov-web/www/index.php diff -u php-gcov-web/www/index.php:1.1.2.2 php-gcov-web/www/index.php:1.1.2.3 --- php-gcov-web/www/index.php:1.1.2.2 Tue Aug 8 18:23:47 2006 +++ php-gcov-web/www/index.php Mon Aug 21 04:06:41 2006 @@ -2,6 +2,8 @@ // Include the site API include_once 'site.api.php'; +include_once 'config.php'; + // Initialize the core components api_init($appvars); @@ -90,35 +92,13 @@ echo "<tr>"; echo "<th align='left'>$version_name</th>"; - show_link($version_name, 'lcov', $path,'index.php'); - //show_link($tag, 'run_tests', $path, 'run-tests.html.inc'); - //$l_time = show_link($tag, 'make_log', $path, 'make.log'); - //show_link($tag, 'make_log_new', $path, 'make.log.new', $l_time); + // todo: select last modified date from an lcov file + echo "<td><a href='viewer.php?version=$version_name'>View</a></td>\n"; + //show_link($version_name, 'lcov', $path,'index.php'); echo '<td>'.$version_last_attempted_build_date.'</td>'."\n"; echo '<td>'.$version_last_successful_build_date.'</td>'."\n"; echo '<td>'.$version_last_build_time.'</td>'."\n"; -/* - // added for last make status - echo "<td>"; - $filepath = $tag.'/last_make_status.inc'; - $fh = @fopen($filepath, 'r'); - // Read file contents - $content = @fread($fh, filesize($filepath)); - if(($content === false) || ($content == '')) - { - $make_last_status = 'N\A'; - } - elseif(trim($content) == strtolower('pass')) - { - $make_last_status = 'Success'; - } - else - { - $make_last_status = 'Failed - check Compile Results'; - } - echo $make_last_status."</td>\n"; -*/ // End additions echo "</tr>\n"; } @@ -126,15 +106,24 @@ </table> <!-- end links --> </p> -<h1>ToDo</h1> + +<h1>How to Help</h1> <p> <ul> -<li>Integrate gcov testing into PHP_4_4 (<a href='PHP_4_4-gcov-20060323.diff.txt.bz2'>patch</a>)</li> -<li>Running the tests from a cron job (5.1 takes ~25 hours, HEAD takes ~52 hours).</li> -<li>Enable all core extensions.</li> -<li>Integrate PECL extensions.</li> -<li>Integrate PEAR classes.</li> -<li>Integrate external components.</li> +<li>You can search and view the results collected on user-submitted platforms and versions by accessing the <a href="viewer.php?func=search">other platforms</a> section.</li> +<li>If you would like to be involved please start by visiting the <a href="http://qa.php.net/">PHP QA website</a> and read the section on <a href="http://qa.php.net/howtohelp.php">How You Can Help</a>.</li> +<li>You can also read the section on <a href="http://qa.php.net/write-test.php">how to write tests</a> to help us improve the testing process on any areas you see not covered.</li> +</ul> +<h2>Downloads</h2> +<ul> +<li>Integrate GCOV testing into PHP_4_4 by applying this <a href="downloads/PHP_4_4-gcov-20060810.diff.txt.bz2">patch</a>.</li> +<li>Integrate PHP/GCOV testing by applying one of the following lcov 1.5 patches: +<ul> +<li><a href="downloads/lcov_1.5-1_all.deb">lcov_1.5-1_all.deb</a></li> +<li><a href="downloads/lcov-1.5-pre1.noarch.rpm">lcov-1.5-pre1.noarch.rpm</a></li> +</ul> +</li> +<li>After installing the above lcov update, replace genhtml with this <a href="downloads/genhtml.gcov-php-net">patch</a>. </ul> </p> </td> http://cvs.php.net/viewvc.cgi/php-gcov-web/www/post.php?r1=1.1.2.1&r2=1.1.2.2&diff_format=u Index: php-gcov-web/www/post.php diff -u php-gcov-web/www/post.php:1.1.2.1 php-gcov-web/www/post.php:1.1.2.2 --- php-gcov-web/www/post.php:1.1.2.1 Fri Aug 11 23:54:17 2006 +++ php-gcov-web/www/post.php Mon Aug 21 04:06:41 2006 @@ -7,35 +7,524 @@ // Include the site API so the database connection can be used include_once 'site.api.php'; +// Include the post function definitions file +include_once 'post.funcs.php'; + // Initialize the core components api_init($appvars); -$flag = false; +// This flag can be used to determine success or failure of posting data +$flag = true; $username = ''; $password = ''; $contents = ''; +$steps = ''; + if(count($_POST) > 0) { + $steps .= "Checking for Posted Content: OK\n"; + $username = $_REQUEST['username']; $password = $_REQUEST['password']; $contents = $_REQUEST['contents']; - // This sql is only for testing purposes - $sql = 'INSERT INTO test(content) VALUES(?)'; + //file_put_contents('../temp/a2/b.xml.bz2.b64', $contents); + // decode the submitted contents from base64 + $contents = base64_decode($contents); + + //file_put_contents('../temp/a2/b.xml.bz2', $contents); + + // Bzip decompress the submitted contents + $contents = bzdecompress($contents); + + //file_put_contents('../temp/a2/b.xml', $contents); + + $stmt = null; + + // Select User ID for verification + $sql = 'SELECT user_id FROM remote_builds WHERE user_name=? AND user_pass=?'; $stmt = $mysqlconn->prepare($sql); + $stmt->execute(array($username, $password)); + $stmt->bindColumn(1, $user_id, PDO::PARAM_INT); + $stmt->fetch(PDO::FETCH_BOUND); - $stmt->execute(array($username.' '.$password)); + $dataarray = array(); - // decode from base64 - $contents = base64_decode($contents); + $steps .= "Check for Username and Password: "; - // decompress to the XML - $contents = bzdecompress($contents); + // todo: eliminate the need for the while + if(($user_id > 0) && is_int($user_id)) + { + $steps .= " OK\n"; + + $dir = 'other_platforms/'.$username; + + // Ensure the user has their own builds dir + if(!@file_exists($dir)) + { + $steps .= "Verifying User Directory: "; + + // It might be a good idea to log these errors + if(@mkdir($dir)) + $steps .= "OK \n"; + else + { + $flag = false; + + $steps .= "Unable to access your user directory at this time.\n"; + } + } + + // Load the XML into an XML object + $xml = simplexml_load_string($contents); + + // Start parsing the XML + $version = $xml->buildinfo->version; + + $steps .= "Verifying PHP Version Tag: "; + + // Validate the PHP version given before proceeding + if(array_search($version, $appvars['site']['tags']) !== false) + { + $steps .= "OK\n"; + + $dir = 'other_platforms/'.$username.'/'.$version; + + $steps .= "Verifying PHP Version Tag Directory: "; + + // Check once if the version tag exists, if not, try creating + if(!@file_exists($dir)) + { + @mkdir($dir); + } + + // Check for directory again, if it fails again, we should log something + if(!@file_exists($dir)) + { + $flag = false; + $steps .= "Unable to access your php version tag directory at this time.\n"; + } + else + { + // If directory now exists, we can continue + + $steps .= "OK\n"; + + // todo: XML should really be validated at this point + + $outdir = $dir; + + $buildstatus = $xml->buildinfo->buildstatus; + $buildtime = $xml->buildinfo->buildtime; + $codecoverage = $xml->buildinfo->codecoverage; + $compiler = $xml->buildinfo->compiler; + $configure = $xml->buildinfo->configure; + $os = $xml->buildinfo->os; + //$valgrind = $xml->buildinfo->valgrind; + + $steps .= "Checking for Compile Results: "; + + // Check for definition of compile_results + if(isset($xml->builddata->compile_results)) + { + $steps .= " OK\n"; + + // compile_results.inc + $index_out = <<< HTML +<table border="1"> +<tr> +<td>File</td> +<td>Number of Errors</td> +<td>Number of Warnings</td> +</tr> +HTML; + // count the number of messages + $count = count($xml->builddata->compile_results->message); + $lastfile = ''; + $file_numerrors = 0; + $file_numwarnings = 0; + + // starting output to hash file + $hash_out = <<< HTML +<table border="1"> +<tr> +<td>Function</td> +<td>Line</td> +<td>Message</td> +</tr> +HTML; + + // loop through all the messages + for($i = 0; $i <= $count; $i++) + { + $message = $xml->builddata->compile_results->message[$i]; + + // Check for file change or the last message + if(($message['file'] != $lastfile) || ($i == $count-1)) + { + // If message is for a different file, start a new file + if($lastfile != '') + { + $hash_out .= '</table>'; + $hash = md5($message['file']); + $filename = $outdir.'/'.$hash.'.inc'; + + $file = basename($lastfile); + + // todo: is there a better method? + file_put_contents($filename, + '<?php $filename = "'.htmlspecialchars($file).'"; ?>'."\n" + .$hash_out.html_footer(false)); + + // Add page information to the index page for this section + $index_out .= <<< HTML +<tr> +<td><a href="viewer.php?username=$username&version=$version&func=compile_results&file=$hash">$lastfile</a></td> +<td>$file_numerrors</td> +<td>$file_numwarnings</td> +</tr> +HTML; + // Reset hash output + $hash_out = <<< HTML +<table border="1"> +<tr> +<td>Function</td> +<td>Line</td> +<td>Message</td> +</tr> +HTML; + + $file_numerrors = 0; + $file_numwarnings = 0; + + } // End check to prevent a non-file from generating output + + // Set last file name to the new file + $lastfile = $message['file']; + + } // End check for file change or last message + + if($message['type'] == 'error') + { + $file_numerrors++; + } + elseif($message['type'] == 'warning') + { + $file_numwarnings++; + } + else + { + + } + + $lxrpath = ''; + + if(substr($message['file'], 0, 6) == '/Zend/') + { + $lxrpath = str_replace('/Zend/','/ZendEngine2/', $message['file']); + $lxrpath = "http://lxr.php.net/source{$lxrpath}#{$message[line]}"; + } + else + { + $lxrpath = "http://lxr.php.net/source/php-src{$message[file]}#{$message[line]}"; + } + + $hash_out .= <<< HTML +<tr> +<td>$message[function]</td> +<td><a href="$lxrpath">$message[line]</td> +<td>$message[type]: $message</td> +</tr> +HTML; + + } // End for loop through compile_results + + $index_out .= '</table>'; + + file_put_contents($outdir.'/compile_results.inc', $index_out.html_footer(false)); + + } // End check for compile_results definition + else + { + $steps .= "N/A\n"; + } + + $steps .= "Checking for Tests: "; + + // Check for definition of tests and build success + if((isset($xml->builddata->tests)) && ($buildstatus == 'pass')) + { + $steps .= "OK\n"; + + $index_out = <<< HTML +<table border="1"> +HTML; + $lastdirname = ''; + + foreach($xml->builddata->tests->test as $test) + { - $stmt->execute(array($contents)); + if($test['status'] == 'fail') + { + $title = $test->title; + $script = highlight_string(htmlspecialchars_decode($test->script, ENT_QUOTES), true); + $difference = base64_decode($test->difference); + $expected = base64_decode($test->expected); + $output = base64_decode($test->output); + + $hash_out = <<< HTML +<h2>Script</h2> +$script +<h2>Expected</h2> +<pre>$expected</pre> +<h2>Output</h2> +<pre>$output</pre> +<h2>Difference</h2> +<pre>$difference</pre> +HTML; + + // Generate hash based on unicode of native test + $hash = ''; + + if($test['type'] == 'Unicode') + $hash = md5($test['file'].'u'); + else + $hash = md5($test['file']); + + $filename = $outdir.'/'.$hash.'.inc'; + $file = basename($test['file']); + $title = $test->title; + + if(dirname($test['file']) != $lastdirname) + { + $lastdirname = dirname($test['file']); + + $index_out .= <<< HTML +<tr> +<td colspan="3" align="center"><b>$lastdirname</b></td> +</tr> +<tr> +<td width="190">File</td> +<td width="80">Test Type</td> +<td width="*">Description</td> +</tr> +HTML; + } + + $index_out .= <<< HTML +<tr> +<td><a href="viewer.php?username=$username&version=$version&func=tests&file=$hash">$file</a></td> +<td>$test[type]</td> +<td>$title</td> +</tr> +HTML; + + // todo: append file name + file_put_contents($filename, '<?php $filename = "'.htmlspecialchars($file).'"; ?>'."\n" + .$hash_out.html_footer(false)); + + } // End check for test failure + + } // End loop through each test + + $index_out .= '</table>'; + + file_put_contents($outdir.'/tests.inc', $index_out.html_footer(false)); + + } // End check for tests definition + else + { + if($buildstatus == 'pass') + $steps .= "No test failures occurred in this build.\n"; + else + $steps .= "OK - test failures do not occur for build failures.\n"; + } + + $steps .= "Checking for Valgrind: "; + + if((isset($xml->builddata->valgrind)) && ($buildstatus == 'pass')) + { + $steps .= "OK\n"; + + $index_out = <<< HTML +<table border="1"> +HTML; + $lastdirname = ''; + + foreach($xml->builddata->valgrind->leak as $leak) + { + $script = highlight_string(htmlspecialchars_decode($leak->script, ENT_QUOTES), true); + $report = $leak->report; + + $hash_out = <<< HTML +<h2>Script</h2> +<pre>$script</pre> +<h2>Report</h2> +<pre>$report</pre> +HTML; + + // Generate hash based on unicode of native leak + $hash = ''; + + if($leak['type'] == 'Unicode') + $hash = md5($leak['file'].'u'); + else + $hash = md5($leak['file']); + + $filename = $outdir.'/'.$hash.'.inc'; + $file = basename($leak['file']); + + if(dirname($leak['file']) != $lastdirname) + { + $lastdirname = dirname($leak['file']); + + $index_out .= <<< HTML +<tr> +<td colspan="3" align="center"><b>$lastdirname</b></td> +</tr> +<tr> +<td width="190">File</td> +<td width="80">Leak Type</td> +<td width="*">Description</td> +</tr> +HTML; + } + + $title = $leak->title; + + $index_out .= <<< HTML +<tr> +<td><a href="viewer.php?username=$username&version=$version&func=valgrind&file=$hash">$file</a></td> +<td>$leak[type]</td> +<td>$title</td> +</tr> +HTML; + + file_put_contents($filename, '<?php $filename = "'.htmlspecialchars($file).'"; ?>' + ."\n".$hash_out.html_footer(false)); + + } + + $index_out .= '</table>'; + + file_put_contents($outdir.'/valgrind.inc', $index_out.html_footer(false)); + + } // End check for valgrind definition + + else + { + if($buildstatus == 'pass') + $steps .= "No memory leaks occurred in this build, or valgrind is not enabled on either your system or for the current build configuration.\n"; + else + { + $steps .= "OK - memory leaks can not be found for failed builds.\n"; + } + + } + + $steps .= "Checking OS: "; + + if(isset($xml->buildinfo->os)) + { + $steps .= "OK\n"; + + preg_match('/(?P<osname>.+) (?P<osversion>[0-9|.]+)/', $xml->buildinfo->os, $osarray); + + $stmt = null; + $sql = 'UPDATE remote_builds SET last_build_xml=?, last_user_os=?, last_user_os_version=? WHERE user_id=?'; + $stmt = $mysqlconn->prepare($sql); + $stmt->execute(array($contents, $osarray['osname'], $osarray['osversion'], $user_id)); + + $codecoverage_string = ''; + + if($codecoverage >= 0) + $codecoverage_string = $codecoverage.'%'; + else + $codecoverage_string = 'N/A'; + + $buildtime_string = ''; + + if($buildtime >= 0) + $buildtime_string = $buildtime. ' seconds'; + else + $buildtime_string = 'N/A'; + + // Assemble content for system.inc + $index_out = ''; + + $index_out .= <<< HTML +<h2>Build Information:</h2> +<table border="0"> +<tr> +<td>Build Status:</td> +<td>$buildstatus</td> +</tr> +<tr> +<td>Build Time:</td> +<td>$buildtime_string</td> +</tr> +<tr> +<td>Code Coverage:</td> +<td>$codecoverage_string</td> +</tr> +</table> +<h2>Configure Used:</h2> +<pre>$configure</pre> +<h2>Compiler Used:</h2> +<pre>$compiler</pre> +<h2>Operating System:</h2> +<pre>$os</pre> +HTML; + + $filename = $outdir.'/system.inc'; + file_put_contents($filename, $index_out.html_footer(false)); + + } + else + { + $steps .= "N/A\n"; + } + + } // End else portion of the check for a valid PHP version given + + } // End check for availability of the output directory + else + { + $flag = false; + + $steps .= "Unable to access PHP tag directory in your user directory.\n"; + } + + } // End check for a valid user + + else + { + $flag = false; + + $steps .= " Username and/or password are incorrect.\n"; + } + + // Send notification on pass or fail of post operation + if($flag) + { + echo "The post process seems to have succeeded!\n"; + } + else + { + echo "Unfortunately, it appears the post process did not succeed.\n"; + } + + // Post the specific results + echo "PHP QA GCOV Server Post Results:\n".$steps; + +} // End check for posted content +else +{ + echo 'File called with invalid parameters.'; + exit; } -// else, an error probably should be logged +// Any clean up would be performed here http://cvs.php.net/viewvc.cgi/php-gcov-web/www/site.api.php?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-gcov-web/www/site.api.php diff -u php-gcov-web/www/site.api.php:1.1.2.2 php-gcov-web/www/site.api.php:1.1.2.3 --- php-gcov-web/www/site.api.php:1.1.2.2 Tue Aug 8 18:23:47 2006 +++ php-gcov-web/www/site.api.php Mon Aug 21 04:06:41 2006 @@ -1,12 +1,25 @@ <?php + +/* // Project: PHP QA GCOV Website -// File: Core API -// Desc: contains core display functions, essential for all pages to include this file +// File: Core Site API File +// Desc: contains core display functions, it is essential for all pages to include this file. +*/ -// Include core files +// Include other core files include_once 'config.php'; // Includes configuration settings include_once 'site.funcs.php'; // Includes the site functions +// Include the database connection file +include_once $appvars['site']['dbcsfile']; + +if(!$mysqlconn) +{ + echo 'Unable to access the database at this time. Please try again in a few minutes'; + exit; +} + + // Application Initialization Function // appsvars is passed to the script by reference function api_init(&$appvars = array()) @@ -15,19 +28,19 @@ $appvars['site']['mytag'] = null; // Start loading version tags - $filename = 'tags.inc'; - $fh = fopen($filename, 'r'); - $content = fread($fh, filesize($filename)); - fclose($fh); + + // todo: if this fails then the tags can not be loaded + $content = file_get_contents($appvars['site']['tagsfile']); $content = trim($content); $elements = explode("\n", $content); - $tagarray = array(); - foreach($elements as $element) + $numelements = count($elements); + + // Recall: the first two elements are only used by the cron scripts + for($i = 2; $i < $numelements; $i++) { - $elementname = explode(' ', $element); - $appvars['site']['tags'][$elementname[0]] = $elementname[0]; + $appvars['site']['tags'][$elements[$i]] = trim($elements[$i]); } // End version tag loading @@ -130,10 +143,13 @@ { $cls = ''; + // Find the last tag if (!--$cnt && isset($appvars['site']['mytag'])) { $cls = 'last'; } + + // Find the current active tag if ($tag == $appvars['site']['mytag']) { if (strlen($cls)) @@ -155,10 +171,33 @@ if (isset($appvars['site']['mytag'])) { - foreach($appvars['site']['sidebarsubitems'] as $item => $href) + // This section determines which sidebarsubitems appear + $sidebarsubitems = array(); + if(isset($appvars['site']['builderusername'])) + $sidebarsubitems = $appvars['site']['sidebarsubitems_otherplatforms']; + else + $sidebarsubitems = $appvars['site']['sidebarsubitems_localbuilds']; + + foreach($sidebarsubitems as $item => $href) { - $cls = " class='small'"; - echo "<li$cls><a href='viewer.php?version={$appvars['site']['mytag']}&amp;func=$href'>$item</a></li>\n"; + + if($appvars['site']['func'] == $href) + { + $cls = " class='active'"; + } + else + { + $cls = " class='small'"; + } + + $link = ''; + + if(isset($appvars['site']['builderusername'])) + $link = "<li$cls><a href='viewer.php?username={$appvars['site']['builderusername']}&version={$appvars['site']['mytag']}&amp;func=$href'>$item</a></li>\n"; + else + $link = "<li$cls><a href='viewer.php?version={$appvars['site']['mytag']}&amp;func=$href'>$item</a></li>\n"; + + echo $link; } } http://cvs.php.net/viewvc.cgi/php-gcov-web/www/style.css?r1=1.1.2.1&r2=1.1.2.2&diff_format=u Index: php-gcov-web/www/style.css diff -u php-gcov-web/www/style.css:1.1.2.1 php-gcov-web/www/style.css:1.1.2.2 --- php-gcov-web/www/style.css:1.1.2.1 Sat Jul 8 19:25:37 2006 +++ php-gcov-web/www/style.css Mon Aug 21 04:06:41 2006 @@ -1,312 +1,312 @@ -/* Let no border around the body appear, and set - it to display on a white background */ -body, html { - margin: 0px; - padding: 0px; - background-color: white; -} - -/* Font settings for page elements */ -body, ul, td, th, p, h1, h2, h3, h4, small, .small, -.tableTitle, .tableExtras, input, textarea, select { - font-family: verdana, arial, helvetica, sans-serif; -} -code, pre, tt { - font-family: Courier, "Courier New", monospace; -} - -/* General header styles */ -h1, h2, h3, h4 { - font-weight: bold; - color: #000066; -} -h1 { font-size: 130%; } -h2 { font-size: 125%; } -h3 { font-size: 110%; } -h4 { font-size: 100%; } - -.top { - font-size: 150%; - font-weight: bold; - color: #000066; - vertical-align: middle; - white-space: none; - margin: 0 !important; - margin-bottom: 0 !important; - padding: 0 !important; -} - -/* Horizontal delimiter defaults */ -hr { - border: 0px; - color: black; - background-color: black; - height: 1px; -} - -/* Default font size for elements */ -body, ul, td, th { - font-size: 85%; -} - -/* Indented block */ -div.indent { - margin-left: 50px; -} - -li { - padding-top: 3px; - padding-bottom: 3px; -} - -em { - font-weight: bold; - font-style: italic; -} - -acronym { - border-bottom: 1px dashed #00cc00; - cursor: help; -} - -.error { - color: #cc0000; -} - -.sidebartoc { -/* font-size: 80%;*/ - padding: 5px; -} - -.sidebartoc p { - text-align: left !important; -} - -small, .small { - font-size: 75%; -} - -a.small { - text-decoration: none; -} - -.tableTitle { - font-weight: bold; -} - -.tableExtras { - font-size: 85%; - color: #FFFFFF; -} - -p.formerror { - border: 1px solid #ff0000; - color: #000000; - background: #ffeeee; - padding: 2px 4px; -} - -div.errors, .warn { - border: 1px dashed #666600; - color: #660000; - background: #ffeeee; - margin: 4px; - padding: 6px; -} - -div.tip, p.tip { - border: 1px solid #00c; - color: #000066; - background: #eeeeff; - padding: 0px 8px; -} - -form.thin { - margin-bottom: 0px; - margin-top: 0px; -} - -.parameter:after { - content: " "; -} - -div.mirror { - border: 1px dashed #660000; - background: #ffeeee; - color: #660000; - margin: 4px; - padding: 6px; -} - -img { - border: 0px; -} -img.flag { - border: 1px solid #000000; -} - -.md5sum { - color: #6666cc; -} - -/* Used on the credits page [.e, .h, .v and .vr] */ -.e { - background-color: #ccccff; - font-weight: bold; -} - -.h { - background-color: #9999cc; - font-weight: bold; -} - -.v { - background-color: #cccccc; -} - -.vr { - background-color: #cccccc; - text-align: right; -} - -/* Standard table formatting */ -table.standard td { - background-color: #eeeeee; -} -table.standard th { - background-color: #cccccc; -} -table.standard td.sub, table.standard th.sub, -table.standard th.subr { - background-color: #dddddd; -} -table.standard th.subr { - text-align: right; - vertical-align: top; -} - -/* browsers handle this differently -input.max, textarea.max, select.max { - width: 100%; -} -*/ - -/* PHP code syntax highlighting */ -div.phpcode, pre { - margin: 5px 0; -} -div.phpcode span.html { - color: black; -} - -div.phpcode span.comment { - color: #FF8000; -} - -div.phpcode span.default { - color: #0000BB; -} - -div.phpcode span.keyword { - color: #007700; -} - -div.phpcode span.string { - color: #DD0000; -} - -.center { - text-align: center; -} -.center table { - margin-left: auto; - margin-right: auto; - text-align: left; -} -.center th { - text-align: center; -} - -/* Thanks listing on frontpage */ -ul.simple { - padding-left: 8px; - margin: 0 0 1em 0; -} -ul.simple li { - padding: 0px; - list-style-type: none; - font-size: 125%; -} - -/* Left sidebar TOC */ -ul#sidebartoc { - margin: 0px 5px 5px 5px; - padding: 0px; -} -/* TOC elements on manual pages ------------------------------------------- */ -ul#sidebartoc li { - margin: 1px 0 1px 1px; - padding: 1px 0 1px 11px; - list-style-type: none; - background-repeat: no-repeat; - background-position: center left; - background-image: url(/images/box-0.gif); -} -ul#sidebartoc li.header { - font-weight: bold; - font-size: 135%; - padding: 5px 0px 5px 11px; - border-bottom: 1px solid #cccccc; - margin-bottom: 5px; -} -ul#sidebartoc li.up { - background-image: url(/images/caret-u.gif); -} -ul#sidebartoc li.home { - background-image: url(/images/caret-t.gif); -} -ul#sidebartoc li.active { - background-image: url(/images/box-1.gif); - font-weight: bold; -} -ul#sidebartoc li.last { - padding: 5px 0px 5px 11px; - border-bottom: 1px solid #cccccc; - margin-bottom: 5px; -} -ul#sidebartoc li.small { - font-size: 90%; -} -ul#sidebartoc li a { - color: #000066; - text-decoration: none; -} -ul#sidebartoc li a:visited { - color: #000066; - text-decoration: none; -} -ul#sidebartoc li a:active { - color: #000066; - text-decoration: none; - font-weight: bold; -} -ul#sidebartoc li a:hover { - text-decoration: underline; -} - -a.header { - color: #000066; - text-decoration: none; -} -a.header:visited { - color: #000066; - text-decoration: none; -} -a.header:active { - color: #000066; - text-decoration: none; -} -a.header:hover { - color: #000066; - text-decoration: underline; -} +/* Let no border around the body appear, and set + it to display on a white background */ +body, html { + margin: 0px; + padding: 0px; + background-color: white; +} + +/* Font settings for page elements */ +body, ul, td, th, p, h1, h2, h3, h4, small, .small, +.tableTitle, .tableExtras, input, textarea, select { + font-family: verdana, arial, helvetica, sans-serif; +} +code, pre, tt { + font-family: Courier, "Courier New", monospace; +} + +/* General header styles */ +h1, h2, h3, h4 { + font-weight: bold; + color: #000066; +} +h1 { font-size: 130%; } +h2 { font-size: 125%; } +h3 { font-size: 110%; } +h4 { font-size: 100%; } + +.top { + font-size: 150%; + font-weight: bold; + color: #000066; + vertical-align: middle; + white-space: none; + margin: 0 !important; + margin-bottom: 0 !important; + padding: 0 !important; +} + +/* Horizontal delimiter defaults */ +hr { + border: 0px; + color: black; + background-color: black; + height: 1px; +} + +/* Default font size for elements */ +body, ul, td, th { + font-size: 85%; +} + +/* Indented block */ +div.indent { + margin-left: 50px; +} + +li { + padding-top: 3px; + padding-bottom: 3px; +} + +em { + font-weight: bold; + font-style: italic; +} + +acronym { + border-bottom: 1px dashed #00cc00; + cursor: help; +} + +.error { + color: #cc0000; +} + +.sidebartoc { +/* font-size: 80%;*/ + padding: 5px; +} + +.sidebartoc p { + text-align: left !important; +} + +small, .small { + font-size: 75%; +} + +a.small { + text-decoration: none; +} + +.tableTitle { + font-weight: bold; +} + +.tableExtras { + font-size: 85%; + color: #FFFFFF; +} + +p.formerror { + border: 1px solid #ff0000; + color: #000000; + background: #ffeeee; + padding: 2px 4px; +} + +div.errors, .warn { + border: 1px dashed #666600; + color: #660000; + background: #ffeeee; + margin: 4px; + padding: 6px; +} + +div.tip, p.tip { + border: 1px solid #00c; + color: #000066; + background: #eeeeff; + padding: 0px 8px; +} + +form.thin { + margin-bottom: 0px; + margin-top: 0px; +} + +.parameter:after { + content: " "; +} + +div.mirror { + border: 1px dashed #660000; + background: #ffeeee; + color: #660000; + margin: 4px; + padding: 6px; +} + +img { + border: 0px; +} +img.flag { + border: 1px solid #000000; +} + +.md5sum { + color: #6666cc; +} + +/* Used on the credits page [.e, .h, .v and .vr] */ +.e { + background-color: #ccccff; + font-weight: bold; +} + +.h { + background-color: #9999cc; + font-weight: bold; +} + +.v { + background-color: #cccccc; +} + +.vr { + background-color: #cccccc; + text-align: right; +} + +/* Standard table formatting */ +table.standard td { + background-color: #eeeeee; +} +table.standard th { + background-color: #cccccc; +} +table.standard td.sub, table.standard th.sub, +table.standard th.subr { + background-color: #dddddd; +} +table.standard th.subr { + text-align: right; + vertical-align: top; +} + +/* browsers handle this differently +input.max, textarea.max, select.max { + width: 100%; +} +*/ + +/* PHP code syntax highlighting */ +div.phpcode, pre { + margin: 5px 0; +} +div.phpcode span.html { + color: black; +} + +div.phpcode span.comment { + color: #FF8000; +} + +div.phpcode span.default { + color: #0000BB; +} + +div.phpcode span.keyword { + color: #007700; +} + +div.phpcode span.string { + color: #DD0000; +} + +.center { + text-align: center; +} +.center table { + margin-left: auto; + margin-right: auto; + text-align: left; +} +.center th { + text-align: center; +} + +/* Thanks listing on frontpage */ +ul.simple { + padding-left: 8px; + margin: 0 0 1em 0; +} +ul.simple li { + padding: 0px; + list-style-type: none; + font-size: 125%; +} + +/* Left sidebar TOC */ +ul#sidebartoc { + margin: 0px 5px 5px 5px; + padding: 0px; +} +/* TOC elements on manual pages ------------------------------------------- */ +ul#sidebartoc li { + margin: 1px 0 1px 1px; + padding: 1px 0 1px 11px; + list-style-type: none; + background-repeat: no-repeat; + background-position: center left; + background-image: url(/images/box-0.gif); +} +ul#sidebartoc li.header { + font-weight: bold; + font-size: 135%; + padding: 5px 0px 5px 11px; + border-bottom: 1px solid #cccccc; + margin-bottom: 5px; +} +ul#sidebartoc li.up { + background-image: url(/images/caret-u.gif); +} +ul#sidebartoc li.home { + background-image: url(/images/caret-t.gif); +} +ul#sidebartoc li.active { + background-image: url(/images/box-1.gif); + font-weight: bold; +} +ul#sidebartoc li.last { + padding: 5px 0px 5px 11px; + border-bottom: 1px solid #cccccc; + margin-bottom: 5px; +} +ul#sidebartoc li.small { + font-size: 90%; +} +ul#sidebartoc li a { + color: #000066; + text-decoration: none; +} +ul#sidebartoc li a:visited { + color: #000066; + text-decoration: none; +} +ul#sidebartoc li a:active { + color: #000066; + text-decoration: none; + font-weight: bold; +} +ul#sidebartoc li a:hover { + text-decoration: underline; +} + +a.header { + color: #000066; + text-decoration: none; +} +a.header:visited { + color: #000066; + text-decoration: none; +} +a.header:active { + color: #000066; + text-decoration: none; +} +a.header:hover { + color: #000066; + text-decoration: underline; +} http://cvs.php.net/viewvc.cgi/php-gcov-web/www/viewer.php?r1=1.1.2.3&r2=1.1.2.4&diff_format=u Index: php-gcov-web/www/viewer.php diff -u php-gcov-web/www/viewer.php:1.1.2.3 php-gcov-web/www/viewer.php:1.1.2.4 --- php-gcov-web/www/viewer.php:1.1.2.3 Tue Aug 8 18:23:47 2006 +++ php-gcov-web/www/viewer.php Mon Aug 21 04:06:41 2006 @@ -3,7 +3,14 @@ // Name: GCOV Viewer page // Desc: page for view PHP version information such as code coverage - + +/* +Irregular Variable Usage: +$filename = used for php include files where a filename is specified in PHP code +$os = used only when func=search + +*/ + // Include the site API include_once 'site.api.php'; @@ -14,27 +21,36 @@ $error = ''; // Start by assuming no error has occurred $file = ''; -$fn = ''; +$fn = ''; // represents the file name -$incfile = ''; +$incfile = ''; // used for php includes of files // Pull in defined variables $file = $_REQUEST['file']; $version = $_REQUEST['version']; -if(isset($_REQUEST['date'])) +// todo: in testing phase +if(isset($_REQUEST['username'])) { - list($year, $month, $day) = split('[^0-9]', $_REQUEST['date'], 3); - - // Ensure each variable is numeric before checking the date - if(is_numeric($month) && (is_numeric($day)) && (is_numeric($year)) - && ($year > 1909)) + if(file_exists('other_platforms/'.$_REQUEST['username'])) { - if(checkdate($month, $day, $year)) + if(file_exists('other_platforms/'.$_REQUEST['username'].'/'.$version)) { - $date = $_REQUEST['date']; + $fileroot = 'other_platforms/'.$_REQUEST['username'].'/'; + $username = $_REQUEST['username']; + + $appvars['site']['builderusername'] = $username; } + else + $fileroot = ''; } + else + $fileroot = ''; +} + +if(isset($_REQUEST['mode'])) +{ + $mode = $_REQUEST['mode']; } // Define the function array @@ -48,6 +64,7 @@ 'pagetitle' => 'PHP: Compile Results for '.$version, 'pagehead' => 'Compile Results' ), + // todo: remove php_test_log 'php_test_log' => array( 'option' => 'text', @@ -74,76 +91,149 @@ ) ); +// Define the acceptable modes for the graphs +$graph_mode_array = array( + 'weekly' => + array( + 'name' => 'weekly', + 'title' => 'Weekly' + ), + 'monthly' => + array( + 'name' => 'monthly', + 'title' => 'Monthly' + ) + ); + +$graph_types_array = array('codecoverage','failures','memleaks','warnings'); + + if(isset($_REQUEST['func'])) { $func = $_REQUEST['func']; + } else { - $func = 'lcov'; -} - -// Accepts: date in format of YYYY_MM_DD (non-numeric separator character) -// Returns: date in textual format of this example: Jan 1 2006 -function datestring_fromdate($date) -{ - //$retstring = ''; - //if(strlen($date) > 9) - //{ - list($year, $month, $day) = split('[^0-9]', $date, 3); - - // Hour, Minute, Second, Month, Day, Year - $time = mktime(0,0,0,$month,$day,$year); - return date('M j Y', $time); - //} - //else - //{ - //$retstring = false; - //} - //return $retstring; + // If username is not set, show lcov, if it is set, default to system + if(!isset($username)) + { + $func = 'lcov'; + } + else + { + $func = 'system'; + } } +$appvars['site']['func'] = $func; // Ensure the version specified is valid (todo: more security required?) // note: !== false is required since PHP_4.4.1 has the 0th place -if(array_search($version, $appvars['site']['tags']) !== false) +if((array_search($version, $appvars['site']['tags']) !== false) || ($func == 'search')) { $appvars['site']['mytag'] = $version; // todo: make functions an array or similiar $func_element = array_search($func, $func_array); - - if($func == 'build') - // Displays the build content for this version + + // todo: this function is experimental + if($func == 'search') { - // Collect file content - $fn = $version.'/build.sh'; - // Open file handle - $fh = @fopen($fn, 'r'); - // Obtain file size - $content = @fread($fh, filesize($fn)); - @fclose($fh); - - // If the file is not readable, set up error content and header - if($content === false) - { - // Define page variables - $appvars['page']['title'] = 'PHP: Test and Code Coverage Analysis of '.$version; - $appvars['page']['head'] = $version.': no build file'; - $appvars['page']['headtitle'] = $version; - $content = 'There is no build file available to be read. Please try again in a few minutes.'; - } + if(isset($_REQUEST['os'])) + { + $count = 0; + $os = $_REQUEST['os']; + $stmt = null; + $stmtarray = array(); + + $appvars['page']['title'] = 'PHP: Other Platform Search Results'; + $appvars['page']['head'] = 'Other Platform Search Results'; + $appvars['page']['headtitle'] = 'Search Results'; + + if($os == 'all') + { + $sql = 'SELECT user_name, last_user_os FROM remote_builds'; + } + else + { + $sql = 'SELECT user_name, last_user_os FROM remote_builds WHERE last_user_os=?'; + $stmtarray = array($os); + } + $stmt = $mysqlconn->prepare($sql); + $stmt->execute($stmtarray); + + // todo: allow check to be narrowed down to a specific PHP version + while($row = $stmt->fetch()) + { + list($user_name, $last_user_os) = $row; + + $dirroot = 'other_platforms/'.$user_name; + + foreach($appvars['site']['tags'] as $phpvertag) + { + + if(file_exists($dirroot.'/'.$phpvertag.'/system.inc')) + { + $content .= <<< HTML +<a href="viewer.php?username=$user_name&version=$phpvertag">$user_name</a> (PHP Version: $phpvertag, OS: $last_user_os)<br /> +HTML; + $count++; + } // End check if tag is active for this user + + } // End loop through each accepted PHP version + + } // End loop through results + + if($count == 0) + { + $content = 'Your search seems too narrow to have any results.'; + } // End check for no results + + } // End check if OS is set else { - // Define page variables - $appvars['page']['title'] = 'PHP: Test and Code Coverage Analysis of '.$version; - $appvars['page']['head'] = $version.': build.sh'; - $appvars['page']['headtitle'] = $version; - $content = "<pre>\n".$content - ."</pre>\n"; - - } // End of content value check - } - + $stmt = null; + $sql = 'SELECT DISTINCT last_user_os FROM remote_builds'; + $stmt = $mysqlconn->prepare($sql); + $stmt->execute(); + + $appvars['page']['title'] = 'PHP: Search Other Platforms'; + $appvars['page']['head'] = 'Other Platform Search'; + $appvars['page']['headtitle'] = 'Search'; + + $content .= <<< HTML +<p>Select the platforms you wish to search for existing builds.</p> +<form method="post" action="viewer.php"> +<input type="hidden" name="func" value="search" /> +<table border="0"> +<tr> +<td>Operating System(s):</td> +<td><select name="os"> +<option value="all">All Platforms</option> +HTML; + + while($row = $stmt->fetch()) + { + list($os) = $row; + + $content .= <<< HTML +<option value="$os">$os</option> +HTML; + + } + + $content .= <<< HTML +</select></td> +</table> +<input type="submit" value="Search" /> +</form> +HTML; + +HTML; + } // End check for Operating System set + + } // End check for function search + else if(@array_key_exists($func,$func_array)) { // Determine the file to use @@ -161,7 +251,7 @@ } // Determine the file path - $filepath = $version.'/'.$incfile.'.inc'; + $filepath = $fileroot.$version.'/'.$incfile.'.inc'; // Obtain file contents by the required method if($func_array[$func]['option'] == 'phpinc') // Parse file as a PHP script @@ -181,8 +271,6 @@ } else // Treat the file contents as regular text file { - // Collect file content - $fn = $version.'/build.sh'; // Open file handle $fh = @fopen($filepath, 'r'); // Read file contents @@ -202,124 +290,73 @@ $appvars['page']['headtitle'] = $version; $content = 'File could not be opened. Please try again in a few minutes, or return to the <a href="viewer.php?version='.$version.'&func='.$func.'">listing</a> page.'; - } + } // End check for no content or failure else { - $appvars['page']['title'] = $func_array[$func]['pagetitle']; - $appvars['page']['head'] = $func_array[$func]['pagehead']; - $appvars['page']['headtitle'] = $version; - } + $appvars['page']['title'] = $func_array[$func]['pagetitle']; - // todo: is this correct? - $content = str_replace($phpdir, 'replaced', $content); - } - else if($func == 'graph') + $appvars['page']['head'] = $func_array[$func]['pagehead']; + + if(isset($username)) + { + $appvars['page']['head'] .= ' (builder: '.$username.')'; + } // End check if username is set + + $appvars['page']['headtitle'] = $version; + } // End check for content + + } // End check for func defined in func_array + + else if($func == 'graph') // todo: revamp this section entirely { // If date is not set display all available dates // todo: format date as the actual date instead of numbers - if(!isset($date)) + if(!@array_key_exists($mode, $graph_mode_array)) { - $file = $version.DIRECTORY_SEPARATOR.'graph.inc'; - - $dates = @file_get_contents($file); - - $temp_date = ''; - $x = 0; - while($x < strlen($dates)) - { - //$date = ''; - if(($dates[$x] != "\n") && ($x < strlen($dates))) - { - $temp_date .= $dates[$x]; - } - else - { - $content .= '<a href="viewer.php?version='.$version.'&amp;func=graph&date='.$temp_date.'">'.datestring_fromdate($temp_date).'</a>'.'<br />'; - $temp_date = ''; - } - $x++; - } + $appvars['page']['title'] = 'PHP: '.$version.' Graphs'; + $appvars['page']['head'] = 'Graphs'; + $appvars['page']['headtitle'] = $version; - if($dates === false) - { - $content = 'No graphs currently exist for this version.'; - } + $content .= <<< HTML +<p>Select the period of time you wish to view as a graphical progression.</p> +HTML; - else + foreach($graph_mode_array as $graph_mode) { - $content = 'Choose a date to view the associated graphs:<br />'.$content; + $content .= <<< HTML +<a href="viewer.php?version=$version&func=graph&mode=$graph_mode[name]">Last $graph_mode[title]</a><br /> +HTML; } - - $appvars['page']['title'] = 'PHP: '.$version.' Graphs'; - $appvars['page']['head'] = 'Graphs'; - $appvars['page']['headtitle'] = $version; } else // Display the graphs for the specified PHP version and date { - $datestring = datestring_fromdate($date); - // todo: if graphs don't exist display something else like a not found - if($datestring === false) - { + $appvars['page']['title'] = 'PHP: '.$version.' Last '.$graph_mode_array[$mode]['title'] . ' Graphs'; + $appvars['page']['head'] = 'Last '.$graph_mode_array[$mode]['title']. ' Graphs'; + $appvars['page']['headtitle'] = $version; - $appvars['page']['title'] = 'PHP: '.$version.' Graphs Not Found For '.$datestring; - $appvars['page']['head'] = 'Graphs Not Found For '.$datestring; - $appvars['page']['headtitle'] = $version; + $content .= '<p>The following images show the changes in code coverage, compile warnings, memory leaks and test failures.</p>'; - $content = 'No graphs could be located for this PHP version for the specified date.'; + $graph_count = 0; - } - else + foreach($graph_types_array as $graph_type) { - $appvars['page']['title'] = 'PHP: '.$version.' Graphs For '.$datestring; - $appvars['page']['head'] = 'Graphs For '.$datestring; - $appvars['page']['headtitle'] = $version; - - $date = basename($date); // ensure a path is not specified here - $content .= '<p>The following images show the changes in number of compile errors, compile warnings, memory leaks and test failures over the past week up to the date of '.$datestring.'.</p>'; - - if(file_exists($version.'/graphs/'.'errors_'.$date.'.png')) - $content .= '<img src="'.$version.'/graphs/'.'errors_'.$date.'.png" />&nbsp;'; - if(file_exists($version.'/graphs/'.'failures_'.$date.'.png')) - $content .= '<img src="'.$version.'/graphs/'.'failures_'.$date.'.png" /><br />'; - if(file_exists($version.'/graphs/'.'memleaks_'.$date.'.png')) - $content .= '<img src="'.$version.'/graphs/'.'memleaks_'.$date.'.png" />&nbsp;'; - if(file_exists($version.'/graphs/'.'warnings_'.$date.'.png')) - $content .= '<img src="'.$version.'/graphs/'.'warnings_'.$date.'.png" /><br />'; - } - } - } + if(file_exists($version.'/graphs/'.$graph_type.'_'.$mode.'.png')) + { + $content .= '<img src="'.$version.'/graphs/'.$graph_type.'_'.$mode.'.png" />&nbsp;'."\n"; + + if(++$graph_count == 2) + $content .= '<br />'."\n"; + + } // End check for graph file + + } // End loop through graph types + + } // End check for valid graph mode + + } // End check for func=graph - else if($func == 'run_tests') - // Displays run-tests content for this version - { - // Collect file content - $fn = $appvars['site']['basepath'].'/'.$version - .'/run-tests.html.inc'; - // Open file handle - $fh = @fopen($fn, 'r'); - // Obtain file size - $content = @fread($fh, filesize($fn)); - @fclose($fh); - - // If the file is not readable, set up error content and header - if($content === false) - { - // Define page variables - $appvars['page']['title'] = 'PHP: Test and Code Coverage Analysis of '.$version; - $appvars['page']['head'] = $version.': no run-tests log'; - $appvars['page']['headtitle'] = $version; - $content = 'There is no run tests log available to be read. Please try again in a few minutes.'; - } - else // If the file was readable, set up page headers - { - // Define page variables - $appvars['page']['title'] = 'PHP: Test and Code Coverage Analysis of '.$version; - $appvars['page']['head'] = $version.': run-tests.php report'; - $appvars['page']['headtitle'] = $version; - } // End of content value check - } else if($func == 'lcov') // Displays the lcov content for this version { http://cvs.php.net/viewvc.cgi/php-gcov-web/www/downloads/PHP_4_4-gcov-20060810.diff.txt.bz2?view=markup&rev=1.1 Index: php-gcov-web/www/downloads/PHP_4_4-gcov-20060810.diff.txt.bz2 +++ php-gcov-web/www/downloads/PHP_4_4-gcov-20060810.diff.txt.bz2 http://cvs.php.net/viewvc.cgi/php-gcov-web/www/downloads/genhtml.gcov-php-net?view=markup&rev=1.1 Index: php-gcov-web/www/downloads/genhtml.gcov-php-net +++ php-gcov-web/www/downloads/genhtml.gcov-php-net http://cvs.php.net/viewvc.cgi/php-gcov-web/www/downloads/lcov-1.5-pre1.noarch.rpm?view=markup&rev=1.1 Index: php-gcov-web/www/downloads/lcov-1.5-pre1.noarch.rpm +++ php-gcov-web/www/downloads/lcov-1.5-pre1.noarch.rpm http://cvs.php.net/viewvc.cgi/php-gcov-web/www/downloads/lcov_1.5-1_all.deb?view=markup&rev=1.1 Index: php-gcov-web/www/downloads/lcov_1.5-1_all.deb +++ php-gcov-web/www/downloads/lcov_1.5-1_all.deb
« previous php.mirrors (#32206) next »