mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-12-26 05:14:36 +03:00
adding web page source code
This commit is contained in:
parent
05a95d464d
commit
5f8600e1bd
@ -8,6 +8,7 @@ Features:
|
||||
- Run regression tests
|
||||
- Run a sample EMS pipeline
|
||||
- Report results into logfiles
|
||||
- A simple web interface in PHP
|
||||
|
||||
How to run cruise control:
|
||||
|
||||
@ -21,4 +22,11 @@ How to run cruise control:
|
||||
4) Execute ./test_all_new_commits.sh yourfile.config
|
||||
|
||||
|
||||
How to set up the web interface:
|
||||
|
||||
1) Install Apache and PHP
|
||||
|
||||
2) Point StaticData::logs_path to correct directory, e.g. /home/cruise/logs/example/
|
||||
Default value is 'data', you might want to just create a symlink.
|
||||
|
||||
Written by Ondrej Bojar, Ales Tamchyna, Barry Haddow, Rimas Blazaitis
|
||||
|
112
cruise-control/web/html_templates.php
Normal file
112
cruise-control/web/html_templates.php
Normal file
@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
function show_header($title)
|
||||
{
|
||||
echo "
|
||||
<html>
|
||||
<head>
|
||||
<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;charset=utf-8\">
|
||||
<title>$title</title>
|
||||
</head><body>";
|
||||
}
|
||||
|
||||
function show_heading($text, $size = 1)
|
||||
{
|
||||
echo "
|
||||
<h$size>$text</h$size>";
|
||||
}
|
||||
|
||||
function show_footer()
|
||||
{
|
||||
echo "
|
||||
</body>
|
||||
<html>";
|
||||
}
|
||||
|
||||
function end_table()
|
||||
{
|
||||
echo "
|
||||
</table>";
|
||||
}
|
||||
|
||||
function array_to_table_row($odd = true, $data)
|
||||
{
|
||||
$bgcolor = $odd ? " bgcolor=\"#ccccdd\"" : "";
|
||||
echo "
|
||||
<tr$bgcolor>";
|
||||
foreach ($data as &$item) {
|
||||
echo "
|
||||
<td style=\"padding-left:8px; padding-right:8px\">$item</td>";
|
||||
}
|
||||
echo "
|
||||
</tr>";
|
||||
}
|
||||
|
||||
function start_table()
|
||||
{
|
||||
echo '
|
||||
<table rules="cols" frame="vsides">';
|
||||
}
|
||||
|
||||
function start_form($action, $method = "get")
|
||||
{
|
||||
echo "
|
||||
<form action=\"$action\" method=\"$method\">";
|
||||
}
|
||||
|
||||
function end_form()
|
||||
{
|
||||
echo "
|
||||
</form>";
|
||||
}
|
||||
|
||||
function show_select_box($items, $name, $selected = "", $onchange_hdl = "")
|
||||
{
|
||||
$onchange = $onchange_hdl ? " onchange=\"$onchange_hdl\"" : "";
|
||||
echo "
|
||||
<select name=\"$name\"$onchange>";
|
||||
foreach ($items as &$item) {
|
||||
$item_selected = $selected == $item ? " selected=\"yes\"" : "";
|
||||
echo "
|
||||
<option value=\"$item\"$item_selected>$item</option>";
|
||||
}
|
||||
echo "
|
||||
</select>";
|
||||
}
|
||||
|
||||
function get_href($label, $url, $new_window = false)
|
||||
{
|
||||
$target = $new_window ? " target=\"_blank\"" : "";
|
||||
return "<a href=\"$url\"$target>$label</a>";
|
||||
}
|
||||
|
||||
function warn($msg)
|
||||
{
|
||||
echo "<p><font color=\"red\"><b>$msg</b></font>";
|
||||
}
|
||||
|
||||
function get_current_url()
|
||||
{
|
||||
return $_SERVER["REQUEST_URI"];
|
||||
}
|
||||
|
||||
function set_var($url, $var, $value)
|
||||
{
|
||||
$url = cut_var($url, $var);
|
||||
if ($url[strlen($url) - 1] == "?") {
|
||||
$url .= "$var=$value";
|
||||
} elseif (strpos($url, "?") !== false) {
|
||||
$url .= "&$var=$value";
|
||||
} else {
|
||||
$url .= "?$var=$value";
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
||||
function cut_var($url, $var)
|
||||
{
|
||||
// XXX there is probably a cleaner solution for this
|
||||
return preg_replace('/&?' . $var . '=[^&]+/', '', $url);
|
||||
}
|
||||
|
||||
?>
|
101
cruise-control/web/index.php
Normal file
101
cruise-control/web/index.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
include("html_templates.php");
|
||||
include("log_wrapper.php");
|
||||
|
||||
const SHOW_ITEMS = 50;
|
||||
const GITHUB_LINK = "https://github.com/moses-smt/mosesdecoder/commit/";
|
||||
|
||||
show_header("Moses Cruise Control");
|
||||
echo "\n<center>\n";
|
||||
|
||||
show_heading("Moses Cruise Control");
|
||||
echo "\n</center>\n";
|
||||
|
||||
// show current status of 'master' branch
|
||||
$master_branch = new Branch("master");
|
||||
$last_commit = $master_branch->get_next_commit();
|
||||
$last_commit->read_log();
|
||||
show_heading("Current status of master: " . colorize_status($last_commit->get_status()), 3);
|
||||
$branch_name = ! empty($_GET["branch"]) ? $_GET["branch"] : "master";
|
||||
|
||||
// check that user wants to see a valid branch
|
||||
$all_branches = get_all_branch_names();
|
||||
if (! in_array($branch_name, $all_branches)) {
|
||||
warn("Branch '$branch_name' not found (only branches with some tests done can be viewed)");
|
||||
$branch_name = "master";
|
||||
}
|
||||
|
||||
// branch select box
|
||||
start_form("", "get");
|
||||
echo "<p>Showing log of branch: ";
|
||||
show_select_box($all_branches, "branch", $branch_name, "submit()");
|
||||
end_form();
|
||||
|
||||
$branch = new Branch("$branch_name");
|
||||
$start_with = ! empty($_GET["start"]) ? $_GET["start"] : 0;
|
||||
$branch->set_line($start_with);
|
||||
|
||||
show_navigation($start_with);
|
||||
|
||||
// table of commits
|
||||
start_table();
|
||||
array_to_table_row(true, array("<b>Commit Link</b>", "<b>Status</b>", "<b>Full Log</b>",
|
||||
"<b>Timestamp</b>", "<b>Author</b>", "<b>Commit Message</b>" ));
|
||||
for ($i = 0; $i < SHOW_ITEMS; $i++) {
|
||||
$last_commit = $branch->get_next_commit();
|
||||
|
||||
if ( $last_commit->get_name() == "" ) {
|
||||
array_to_table_row(array("=== End of log ==="));
|
||||
break;
|
||||
}
|
||||
$last_commit->read_log();
|
||||
$last_commit->read_info();
|
||||
|
||||
array_to_table_row(($i % 2 == 1),
|
||||
array( get_href(substr($last_commit->get_name(), 0, 10) . "...", GITHUB_LINK . $last_commit->get_name(), true),
|
||||
colorize_status($last_commit->get_status()),
|
||||
$last_commit->was_tested() ? get_href("Log", $last_commit->get_log_file(), true) : "N/A",
|
||||
$last_commit->get_timestamp(),
|
||||
$last_commit->get_author(),
|
||||
substr($last_commit->get_message(), 0, 30) . (strlen($last_commit->get_message()) > 30 ? "..." : "")));
|
||||
}
|
||||
|
||||
end_table();
|
||||
|
||||
show_navigation($start_with);
|
||||
show_footer();
|
||||
|
||||
// HTML ends here
|
||||
|
||||
function colorize_status($status)
|
||||
{
|
||||
switch ( substr(strtolower($status), 0, 1) ) {
|
||||
case "o":
|
||||
$color = "green";
|
||||
break;
|
||||
case "f":
|
||||
$color = "red";
|
||||
break;
|
||||
default:
|
||||
$color = "#FFDD00";
|
||||
}
|
||||
return "<font color=\"$color\"><b>$status</b></font>";
|
||||
}
|
||||
|
||||
function show_navigation($start_with)
|
||||
{
|
||||
start_form("", "get");
|
||||
if ($start_with > 0) {
|
||||
echo get_href("<p>Previous",
|
||||
set_var(get_current_url(), "start", max(0, $start_with - SHOW_ITEMS)));
|
||||
} else {
|
||||
echo "Previous";
|
||||
}
|
||||
echo " ";
|
||||
|
||||
echo get_href("Next", set_var(get_current_url(), "start", $start_with + SHOW_ITEMS));
|
||||
end_form();
|
||||
}
|
||||
|
||||
?>
|
188
cruise-control/web/log_wrapper.php
Normal file
188
cruise-control/web/log_wrapper.php
Normal file
@ -0,0 +1,188 @@
|
||||
<?php
|
||||
|
||||
class StaticData
|
||||
{
|
||||
const logs_path = "./data/";
|
||||
}
|
||||
|
||||
function get_all_branch_names()
|
||||
{
|
||||
$branches = array();
|
||||
$dir_hdl = opendir(StaticData::logs_path);
|
||||
while (($file = readdir($dir_hdl)) !== false) {
|
||||
if (($pos = strpos($file, ".revlist")) > 0) {
|
||||
array_push($branches, substr($file, 0, $pos));
|
||||
}
|
||||
}
|
||||
return $branches;
|
||||
}
|
||||
|
||||
class Branch
|
||||
{
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->create_revlist_hdl();
|
||||
}
|
||||
|
||||
public function get_next_commit()
|
||||
{
|
||||
return new Commit( chop( fgets($this->revlist_hdl) ) );
|
||||
}
|
||||
|
||||
public function set_line($line)
|
||||
{
|
||||
$this->reset();
|
||||
$index = 0;
|
||||
while ($this->revlist_hdl && $index < $line) {
|
||||
fgets($this->revlist_hdl);
|
||||
$index++;
|
||||
}
|
||||
}
|
||||
|
||||
public function reset()
|
||||
{
|
||||
fclose($this->revlist_hdl);
|
||||
$this->create_revlist_hdl();
|
||||
}
|
||||
|
||||
private function create_revlist_hdl()
|
||||
{
|
||||
$this->revlist_hdl = fopen(StaticData::logs_path . "/" . $this->name . ".revlist", "r");
|
||||
}
|
||||
|
||||
private $name;
|
||||
private $revlist_hdl;
|
||||
}
|
||||
|
||||
class Commit
|
||||
{
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function read_log()
|
||||
{
|
||||
if (! $this->was_tested()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$log_hdl = fopen(StaticData::logs_path . "/" . substr($this->name, 0, 1) . "/" . $this->name . ".log", "r");
|
||||
while (($line = fgets($log_hdl)) !== false) {
|
||||
if (preg_match('/tests passed/', $line)) {
|
||||
$this->passed_percent = substr($line, 0, strpos('%', $line));
|
||||
}
|
||||
else if (preg_match('/INVESTIGATE THESE FAILED TESTS/', $line)) {
|
||||
$this->failed_tests = substr($line, 39);
|
||||
}
|
||||
else if (! $this->is_ok() && preg_match('/## Status:/', $line)) {
|
||||
$this->failed_at = substr($line, 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function read_info()
|
||||
{
|
||||
$info_hdl = fopen(StaticData::logs_path . "/" . substr($this->name, 0, 1) . "/" . $this->name . ".info", "r");
|
||||
while (($line = fgets($info_hdl)) !== false) {
|
||||
if (preg_match('/Author:/', $line)) {
|
||||
$this->author = substr("$line", 7);
|
||||
}
|
||||
else if (preg_match('/Date:/', $line)) {
|
||||
$this->timestamp = substr("$line", 12);
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (($line = fgets($info_hdl)) !== false) {
|
||||
$this->message .= chop($line);
|
||||
}
|
||||
$this->message = preg_replace('/\s+/', ' ', $this->message);
|
||||
}
|
||||
|
||||
public function was_tested()
|
||||
{
|
||||
return file_exists(StaticData::logs_path . "/" . substr($this->name, 0, 1) . "/" . $this->name . ".log");
|
||||
}
|
||||
|
||||
public function is_ok()
|
||||
{
|
||||
if (! $this->was_tested()) {
|
||||
return false;
|
||||
} else {
|
||||
return file_exists(StaticData::logs_path . "/" . substr($this->name, 0, 1) . "/" . $this->name . ".OK");
|
||||
}
|
||||
}
|
||||
|
||||
public function get_status()
|
||||
{
|
||||
return $this->was_tested()
|
||||
? ($this->is_ok() ? "OK" : "Failed: " . $this->get_failed_at()) : "Not tested";
|
||||
}
|
||||
|
||||
public function get_passed_percent()
|
||||
{
|
||||
return $this->passed_percent;
|
||||
}
|
||||
|
||||
public function get_failed_tests()
|
||||
{
|
||||
return $this->failed_tests;
|
||||
}
|
||||
|
||||
public function get_failed_at()
|
||||
{
|
||||
return $this->failed_at;
|
||||
}
|
||||
|
||||
public function get_message()
|
||||
{
|
||||
return $this->message;
|
||||
}
|
||||
|
||||
public function get_author()
|
||||
{
|
||||
return $this->author;
|
||||
}
|
||||
|
||||
public function get_timestamp()
|
||||
{
|
||||
return $this->timestamp;
|
||||
}
|
||||
|
||||
public function get_name()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function get_log_file()
|
||||
{
|
||||
return "show_commit.php?commit_id=$this->name&type=log";
|
||||
}
|
||||
|
||||
public function get_info_file()
|
||||
{
|
||||
return "show_commit.php?commit_id=$this->name&type=info";
|
||||
}
|
||||
|
||||
private function open_log()
|
||||
{
|
||||
return fopen($this->get_log_file());
|
||||
}
|
||||
|
||||
private function open_info()
|
||||
{
|
||||
return fopen($this->get_info_file());
|
||||
}
|
||||
|
||||
private $name;
|
||||
private $passed_percent;
|
||||
private $failed_tests;
|
||||
private $failed_at;
|
||||
private $message;
|
||||
private $author;
|
||||
private $timestamp;
|
||||
|
||||
}
|
||||
|
||||
?>
|
17
cruise-control/web/show_commit.php
Normal file
17
cruise-control/web/show_commit.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
include("html_templates.php");
|
||||
include("log_wrapper.php");
|
||||
|
||||
$type = $_GET["type"];
|
||||
$commit_id = $_GET["commit_id"];
|
||||
|
||||
if (($type != "log" && $type != "info") || empty($commit_id)) {
|
||||
warn("Wrong arguments, dying") && die();
|
||||
}
|
||||
|
||||
header("Content-Type: text/plain; charset=UTF-8");
|
||||
|
||||
include(StaticData::logs_path . "/" . substr($commit_id, 0, 1) . "/" . $commit_id . "." . $type);
|
||||
|
||||
?>
|
Loading…
Reference in New Issue
Block a user