blob: 1628355f03fac3e235c62b0e87d6cc63e13ebacf [file] [log] [blame]
<?php
/***********************************************************************
* Copyright (c) Eclipse Foundation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-2.0
***********************************************************************/
require_once "../../eclipse.org-common/system/app.class.php";
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App ();
$Nav = new Nav ();
$Menu = new Menu ();
include ($App->getProjectCommon ());
require_once '../classes/Project.class.php';
require_once '../classes/ProjectStatusReporter.class.inc';
require_once '../classes/debug.php';
require_once '../classes/database.inc';
require_once '../classes/common.php';
require_once './charts.inc';
callIfNotCommitter(function() {
header('Location: /projects');
exit;
});
$pageTitle = "Eclipse Project Overview";
$pageKeywords = "";
$pageAuthor = "Wayne Beaton";
ob_start ();
if (!(($id = @$_GET['id']) && isValidProjectId($id))) $id = null;
$options = array();
$options['width'] = is_numeric(@$_GET['width']) ? @$_GET['width'] : 500;
$options['height'] = is_numeric(@$_GET['height']) ? @$_GET['height'] : 200;
$options['start'] = @$_GET['start'] ? date('Y-m-d', strtotime(@$_GET['start'])) : null;
$options['end'] = @$_GET['end'] ? date('Y-m-d', strtotime(@$_GET['end'])) : null;
// The 'committers' parameter when present or set to anything
// but 'false' will result in charts being rendered for every
// project committer. This can be expensive, so we only do it
// when asked.
$showCommitters = isset($_GET['committers']) && ($_GET['committers']!='false');
// NOTE that subprojects are not rendered when the committers are
// (to do both can be *very* expensive for a top-level project).
$showSubprojects = $showCommitters ? false : (isset($_GET['subprojects']) && ($_GET['subprojects']!='false'));
// Add an entry to focus the report on every
// top-level project to the navigation bar.
$Nav->addNavSeparator("Report", "./report.php");
foreach(Project::getTopLevelProjects() as $project) {
$Nav->addCustomNav($project->getName(), "?id={$project->getId()}", "_self", 2);
}
/**
* Render an HTML report for a particular project.
*
* This uses an instance of the ProjectStatusReporter class to collect
* and render specific bits of information about the project.
*
* @see ProjectStatusReporter
*
* @param Project $project
* @param boolean $showCommitters
*/
function renderProjectReport(Project $project, $options, $showCommitters = false) {
if (! $project)
return;
$status = new ProjectStatusReporter ( array (
$project->getId ()
) );
echo "<h2><a href=\"?id={$project->getId()}\">{$project->getFormalName()}</a></h2>";
echo "<div style=\"margin-left:1em\">";
// Render alerts. Alerts are a warning about something that might
// be odd or wrong about a project. We render each line using a
// warning icon as the bullet.
if ($alerts = $status->alerts($project)) {
echo "<h3>Alerts</h3>";
echo "<ul style=\"list-style-type: none\">";
foreach($alerts as $message) {
echo "<li><span style=\"color: red;\">&#9888;</span> {$message}</li>";
}
echo "</ul>";
}
// Render project stats in a table. This is a little clunky in my
// attempt to make the specification of individual stats easily
// extended while making the rendering very consistent. Each of the
// "values" from the ProjectStatusReporter contains information about
// a particular bit of data from the project (including a label and
// corresponding value).
echo "<h3>Lifetime stats</h3>";
echo "<div class=\"container\">";
$status->values ( $project->getId (), function ($column) {
echo "<div class=\"row\"><div class=\"col-md-6\">{$column->getTitle()}:</div><div class=\"col-md-6\">{$column->getValue()}</div></div>";
} );
echo "</div>";
// Render charts
// FIXME Experimental.
$status->charts($project, function($builder) use (&$options) {
$builder
->width ( $options['width'] )
->height ( $options['height'] )
->substitute (':start', $options['start'])
->substitute (':end', $options['end'])
->render();
});
// Show committers if required.
// FIXME Experimental
if ($showCommitters) {
echo "<h3>Committer Activity</h3>";
echo "<p>Commit activity for current committers.</p>";
echo "<p>Commits in {$project->getName()} repositories specificially.</p>";
/*
* Get a list of active committers and render an activity chart for each of them.
*/
$sql = "
select
concat(cm.first, ' ', cm.last) as name, cm.id
from CommitterProject as cp
join Committer as cm on cp.id=cm.id
where cp.project=':project' and inactiveDate>now()";
query('dashboard', $sql, array(':project' => $project->getId()), function($row) use (&$project, &$options) {
echo "<div style=\"margin-left:2em\">";
echo "<h4>{$row['name']} Commits</h4>";
ChartBuilder::named("committer_activity_" . rand())
->query('dashboard', "
select
periods.period as period,
if (commits.count is null, 0, commits.count) as count
from (
select distinct period
from CommitterProjectActivity
where
period
between (
select min(period)
from CommitterProjectActivity
where
login=':id'
and project=':project')
and date_format(now(),'%Y%m')
) as periods
left join
CommitterProjectActivity as commits
on (periods.period = commits.period
and commits.login=':id'
and commits.project=':project')
order by period
")
->substitute(':id', $row['id'])
->substitute(':project', $project->getId())
->column ( 'Month', 'period', 'string', function ($value) {
return asYearMonth ( $value );
} )
->column ( 'Commits', 'count', 'number' )
->columnChart ()
->height ( $options['height'] )
->width ( $options['width'] )
->option ( 'legend', 'none' )
->option ('hAxis', array('slantedText' => false))
->render();
echo "</div>";
});
}
echo "</div>";
}
?>
<div id="maincontent">
<div id="midcolumn">
<h1><?=$pageTitle?></h1>
<p>EXPERIMENTAL. This page shows some basic metrics.</p>
<?php
$project = Project::getProject($id);
if ($project) {
renderProjectReport($project, $options, $showCommitters);
if ($showSubprojects) {
foreach($project->getChildren() as $child) {
renderProjectReport($child, $options, false);
}
}
} else {
foreach(Project::getTopLevelProjects() as $project) {
renderProjectReport($project, $options, false);
}
}
?>
</div>
</div>
<?php
$html = ob_get_contents ();
ob_end_clean ();
$App->generatePage ( null, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html );
?>