Merge branch 'master' of github.com:Block8/PHPCI into dc/languages

This commit is contained in:
Dan Cryer 2014-12-04 10:23:16 +00:00
commit 56bbf13f34
6 changed files with 195 additions and 189 deletions

View file

@ -61,8 +61,9 @@ class BuildStore extends BuildStoreBase
$stmt->bindValue(':status', $status);
if ($stmt->execute()) {
$res = $stmt->fetch(\PDO::FETCH_ASSOC);
return new Build($res);
if ($data = $stmt->fetch(\PDO::FETCH_ASSOC)) {
return new Build($data);
}
} else {
return array();
}

View file

@ -75,8 +75,54 @@ foreach($projects as $project):
$subcls = 'yellow';
}
$buildCount = count($builds[$project->getId()]);
$lastSuccess = $successful[$project->getId()];
$lastFailure = $failed[$project->getId()];
$message = 'No builds yet!';
$shortMessage = 'No builds yet!';
if ($buildCount > 0) {
if ($failures > 0) {
$shortMessage = $failures . ' / ' . $buildCount . ' failed.';
$message = $failures . ' out of the last ' . $buildCount . ' builds failed.';
if (!is_null($lastSuccess) && !is_null($lastSuccess->getFinished())) {
$message .= ' The last successful build was ' . $lastSuccess->getFinished()->format('M j Y') . '.';
} else {
$message .= ' This project has never built successfully.';
}
} else {
$shortMessage = $buildCount . ' / ' . $buildCount . ' passed.';
$message = 'All of the last ' . $buildCount . ' builds passed.';
if (!is_null($lastFailure) && !is_null($lastFailure->getFinished())) {
$message .= ' The last failed build was ' . $lastFailure->getFinished()->format('M j Y') . '.';
} else {
$message .= ' This project has never failed to build.';
}
}
}
?>
<?php if (count($projects) > 10): ?>
<div class="small-box bg-<?php print $subcls; ?>">
<div class="inner">
<h4>
<strong>
<a href="<?php print PHPCI_URL; ?>project/view/<?php print $project->getId(); ?>">
<?php print $project->getTitle(); ?>
</a>
</strong> -
<?php print $shortMessage; ?>
</h4>
</div>
</div>
<?php else: ?>
<div class="small-box bg-<?php print $subcls; ?>">
<div class="inner">
<h3>
@ -84,28 +130,11 @@ foreach($projects as $project):
<?php print $project->getTitle(); ?>
</a>
</h3>
<p>
<?php if ($failures > 0): ?>
<?php print $failures; ?> out of the last
<?php print count($builds[$project->getId()]); ?> builds have failed.
<?php if (!is_null($successful[$project->getId()])): ?>
The last successful build was
<?php print $successful[$project->getId()]->getFinished()->format('M j Y'); ?>
<?php else: ?>
This project has never built successfully.
<?php endif; ?>
<?php else: ?>
All of the last <?php print count($builds[$project->getId()]); ?> builds passed.
<?php if (!is_null($failed[$project->getId()])): ?>
The last failed build was
<?php print $failed[$project->getId()]->getFinished()->format('M j Y'); ?>
<?php else: ?>
This project has never failed to build.
<?php endif; ?>
<?php endif; ?>
<?php print $message; ?>
</p>
</div>
<div class="icon">
<i class="fa fa-<?php print $project->getIcon(); ?>"></i>
@ -115,4 +144,5 @@ foreach($projects as $project):
</a>
</div>
<?php endif; ?>
<?php endforeach; ?>

View file

@ -74,7 +74,7 @@ use PHPCI\Helper\Lang;
margin-bottom: 20px;
}
.small-box h3 a {
.small-box h3 a, .small-box h4 a {
color: #fff;
}

106
composer.lock generated
View file

@ -1,8 +1,7 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
],
"hash": "650fe5576922dea4ac3b1be72d882a58",
"packages": [
@ -364,17 +363,17 @@
},
{
"name": "symfony/class-loader",
"version": "v2.6.0",
"version": "v2.6.1",
"target-dir": "Symfony/Component/ClassLoader",
"source": {
"type": "git",
"url": "https://github.com/symfony/ClassLoader.git",
"reference": "b403af3d4fa3a2c3c926121c05042107e3a5b916"
"reference": "ba3300e6d79eb51ca9edf77791bbd0497f6030dc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/b403af3d4fa3a2c3c926121c05042107e3a5b916",
"reference": "b403af3d4fa3a2c3c926121c05042107e3a5b916",
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/ba3300e6d79eb51ca9edf77791bbd0497f6030dc",
"reference": "ba3300e6d79eb51ca9edf77791bbd0497f6030dc",
"shasum": ""
},
"require": {
@ -410,21 +409,21 @@
],
"description": "Symfony ClassLoader Component",
"homepage": "http://symfony.com",
"time": "2014-11-20 13:24:23"
"time": "2014-12-02 20:19:20"
},
{
"name": "symfony/config",
"version": "v2.5.7",
"version": "v2.5.8",
"target-dir": "Symfony/Component/Config",
"source": {
"type": "git",
"url": "https://github.com/symfony/Config.git",
"reference": "7b11dceebaaf877b75bc1aedfd831a2ddc326de9"
"reference": "92f0b4c625b8c42d394b53f879d2795d84bb8c4f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Config/zipball/7b11dceebaaf877b75bc1aedfd831a2ddc326de9",
"reference": "7b11dceebaaf877b75bc1aedfd831a2ddc326de9",
"url": "https://api.github.com/repos/symfony/Config/zipball/92f0b4c625b8c42d394b53f879d2795d84bb8c4f",
"reference": "92f0b4c625b8c42d394b53f879d2795d84bb8c4f",
"shasum": ""
},
"require": {
@ -458,21 +457,21 @@
],
"description": "Symfony Config Component",
"homepage": "http://symfony.com",
"time": "2014-11-20 13:22:25"
"time": "2014-12-02 20:15:53"
},
{
"name": "symfony/console",
"version": "v2.6.0",
"version": "v2.6.1",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
"url": "https://github.com/symfony/Console.git",
"reference": "d3bac228fd7a2aac9193e241b239880b3ba39a10"
"reference": "ef825fd9f809d275926547c9e57cbf14968793e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Console/zipball/d3bac228fd7a2aac9193e241b239880b3ba39a10",
"reference": "d3bac228fd7a2aac9193e241b239880b3ba39a10",
"url": "https://api.github.com/repos/symfony/Console/zipball/ef825fd9f809d275926547c9e57cbf14968793e8",
"reference": "ef825fd9f809d275926547c9e57cbf14968793e8",
"shasum": ""
},
"require": {
@ -515,21 +514,21 @@
],
"description": "Symfony Console Component",
"homepage": "http://symfony.com",
"time": "2014-11-20 13:24:23"
"time": "2014-12-02 20:19:20"
},
{
"name": "symfony/filesystem",
"version": "v2.5.7",
"version": "v2.5.8",
"target-dir": "Symfony/Component/Filesystem",
"source": {
"type": "git",
"url": "https://github.com/symfony/Filesystem.git",
"reference": "3c3e382bd869b3ec10008a3d9ef455b1cc2868db"
"reference": "e5fc05a3a1dbb4ea0bed80fe7bd21ba3cab88c42"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/3c3e382bd869b3ec10008a3d9ef455b1cc2868db",
"reference": "3c3e382bd869b3ec10008a3d9ef455b1cc2868db",
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/e5fc05a3a1dbb4ea0bed80fe7bd21ba3cab88c42",
"reference": "e5fc05a3a1dbb4ea0bed80fe7bd21ba3cab88c42",
"shasum": ""
},
"require": {
@ -562,21 +561,21 @@
],
"description": "Symfony Filesystem Component",
"homepage": "http://symfony.com",
"time": "2014-11-16 17:28:00"
"time": "2014-12-02 20:15:53"
},
{
"name": "symfony/yaml",
"version": "v2.6.0",
"version": "v2.6.1",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
"reference": "51c845cf3e4bfc182d1d5c05ed1c7338361d86f8"
"reference": "3346fc090a3eb6b53d408db2903b241af51dcb20"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/51c845cf3e4bfc182d1d5c05ed1c7338361d86f8",
"reference": "51c845cf3e4bfc182d1d5c05ed1c7338361d86f8",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/3346fc090a3eb6b53d408db2903b241af51dcb20",
"reference": "3346fc090a3eb6b53d408db2903b241af51dcb20",
"shasum": ""
},
"require": {
@ -609,7 +608,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com",
"time": "2014-11-20 13:24:23"
"time": "2014-12-02 20:19:20"
}
],
"packages-dev": [
@ -1006,16 +1005,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "2.0.11",
"version": "2.0.13",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "53603b3c995f5aab6b59c8e08c3a663d2cc810b7"
"reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/53603b3c995f5aab6b59c8e08c3a663d2cc810b7",
"reference": "53603b3c995f5aab6b59c8e08c3a663d2cc810b7",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5",
"reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5",
"shasum": ""
},
"require": {
@ -1067,7 +1066,7 @@
"testing",
"xunit"
],
"time": "2014-08-31 06:33:04"
"time": "2014-12-03 06:41:44"
},
{
"name": "phpunit/php-file-iterator",
@ -1498,16 +1497,16 @@
},
{
"name": "sebastian/environment",
"version": "1.2.0",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "0d9bf79554d2a999da194a60416c15cf461eb67d"
"reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/0d9bf79554d2a999da194a60416c15cf461eb67d",
"reference": "0d9bf79554d2a999da194a60416c15cf461eb67d",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7",
"reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7",
"shasum": ""
},
"require": {
@ -1544,7 +1543,7 @@
"environment",
"hhvm"
],
"time": "2014-10-22 06:38:05"
"time": "2014-10-25 08:00:45"
},
{
"name": "sebastian/exporter",
@ -1808,17 +1807,17 @@
},
{
"name": "symfony/dependency-injection",
"version": "v2.5.7",
"version": "v2.5.8",
"target-dir": "Symfony/Component/DependencyInjection",
"source": {
"type": "git",
"url": "https://github.com/symfony/DependencyInjection.git",
"reference": "662d8f5e4a7542dca4194fb3f3bda0a57e65f0a4"
"reference": "b4afda3c24867a17f93237ac1fcce917cc9d7695"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/662d8f5e4a7542dca4194fb3f3bda0a57e65f0a4",
"reference": "662d8f5e4a7542dca4194fb3f3bda0a57e65f0a4",
"url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/b4afda3c24867a17f93237ac1fcce917cc9d7695",
"reference": "b4afda3c24867a17f93237ac1fcce917cc9d7695",
"shasum": ""
},
"require": {
@ -1861,21 +1860,21 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "http://symfony.com",
"time": "2014-11-16 17:28:00"
"time": "2014-12-02 21:48:32"
},
{
"name": "symfony/finder",
"version": "v2.6.0",
"version": "v2.6.1",
"target-dir": "Symfony/Component/Finder",
"source": {
"type": "git",
"url": "https://github.com/symfony/Finder.git",
"reference": "d574347c652a14cfee0349f744c7880e1d9029fd"
"reference": "0d3ef7f6ec55a7af5eca7914eaa0dacc04ccc721"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/Finder/zipball/d574347c652a14cfee0349f744c7880e1d9029fd",
"reference": "d574347c652a14cfee0349f744c7880e1d9029fd",
"url": "https://api.github.com/repos/symfony/Finder/zipball/0d3ef7f6ec55a7af5eca7914eaa0dacc04ccc721",
"reference": "0d3ef7f6ec55a7af5eca7914eaa0dacc04ccc721",
"shasum": ""
},
"require": {
@ -1908,7 +1907,7 @@
],
"description": "Symfony Finder Component",
"homepage": "http://symfony.com",
"time": "2014-11-28 10:00:40"
"time": "2014-12-02 20:19:20"
},
{
"name": "theseer/fdomdocument",
@ -1951,15 +1950,20 @@
"time": "2014-09-13 10:57:19"
}
],
"aliases": [],
"aliases": [
],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"stability-flags": [
],
"platform": {
"php": ">=5.3.8",
"ext-mcrypt": "*",
"ext-pdo": "*",
"ext-pdo_mysql": "*"
},
"platform-dev": []
"platform-dev": [
]
}

View file

@ -9,7 +9,21 @@ var timePlugin = ActiveBuild.UiPlugin.extend({
},
render: function() {
var created = new Date(ActiveBuild.buildData.created);
var created = '';
var started = '';
var finished = '';
if (ActiveBuild.buildData.created) {
created = dateFormat(ActiveBuild.buildData.created);
}
if (ActiveBuild.buildData.started) {
started = dateFormat(ActiveBuild.buildData.started);
}
if (ActiveBuild.buildData.finished) {
finished = dateFormat(ActiveBuild.buildData.finished);
}
return '<table class="table table-striped table-bordered">' +
'<thead>' +
@ -21,9 +35,9 @@ var timePlugin = ActiveBuild.UiPlugin.extend({
'</thead>' +
'<tbody>' +
'<tr>' +
'<td id="created">' + created.format('mmm d yyyy, H:MM') + '</td>' +
'<td id="started">' + ActiveBuild.buildData.started + '</td>' +
'<td id="finished">' + ActiveBuild.buildData.finished + '</td>' +
'<td id="created">' + created + '</td>' +
'<td id="started">' + started + '</td>' +
'<td id="finished">' + finished + '</td>' +
'</tr>' +
'</tbody>' +
'</table>';
@ -32,20 +46,23 @@ var timePlugin = ActiveBuild.UiPlugin.extend({
onUpdate: function(e) {
var build = e.queryData;
var created = new Date(build.created);
var created = '';
var started = '';
if (build.started) {
var started = new Date(build.started);
started = started.format('mmm d yyyy, H:MM');
var finished = '';
if (build.created) {
created = dateFormat(build.created);
}
var finished = '';
if (build.finished) {
var finished = new Date(build.finished);
finished = finished.format('mmm d yyyy, H:MM');
if (build.started) {
started = dateFormat(build.started);
}
$('#created').text(created.format('mmm d yyyy, H:MM'));
if (build.finished) {
finished = dateFormat(build.finished);
}
$('#created').text(created);
$('#started').text(started);
$('#finished').text(finished);
}

View file

@ -407,114 +407,68 @@ function setupProjectForm()
});
}
var dateFormat = function () {
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
timezoneClip = /[^-+\dA-Z]/g,
pad = function (val, len) {
val = String(val);
len = len || 2;
while (val.length < len) val = "0" + val;
return val;
};
// Regexes and supporting functions are cached through closure
return function (date, mask, utc) {
var dF = dateFormat;
// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
mask = date;
date = undefined;
}
function dateFormat(date)
{
if (typeof date == 'string') {
date = new Date(date);
}
var rtn = '';
// Passing date through Date applies Date.parse, if necessary
date = date ? new Date(date) : new Date;
if (isNaN(date)) throw SyntaxError("invalid date");
switch (date.getMonth()) {
case 0:
rtn = 'Jan ';
break;
mask = String(dF.masks[mask] || mask || dF.masks["default"]);
case 1:
rtn = 'Feb ';
break;
// Allow setting the utc argument via the mask
if (mask.slice(0, 4) == "UTC:") {
mask = mask.slice(4);
utc = true;
}
case 2:
rtn = 'Mar ';
break;
var _ = utc ? "getUTC" : "get",
d = date[_ + "Date"](),
D = date[_ + "Day"](),
m = date[_ + "Month"](),
y = date[_ + "FullYear"](),
H = date[_ + "Hours"](),
M = date[_ + "Minutes"](),
s = date[_ + "Seconds"](),
L = date[_ + "Milliseconds"](),
o = utc ? 0 : date.getTimezoneOffset(),
flags = {
d: d,
dd: pad(d),
ddd: dF.i18n.dayNames[D],
dddd: dF.i18n.dayNames[D + 7],
m: m + 1,
mm: pad(m + 1),
mmm: dF.i18n.monthNames[m],
mmmm: dF.i18n.monthNames[m + 12],
yy: String(y).slice(2),
yyyy: y,
h: H % 12 || 12,
hh: pad(H % 12 || 12),
H: H,
HH: pad(H),
M: M,
MM: pad(M),
s: s,
ss: pad(s),
l: pad(L, 3),
L: pad(L > 99 ? Math.round(L / 10) : L),
t: H < 12 ? "a" : "p",
tt: H < 12 ? "am" : "pm",
T: H < 12 ? "A" : "P",
TT: H < 12 ? "AM" : "PM",
Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
};
case 3:
rtn = 'Apr ';
break;
return mask.replace(token, function ($0) {
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
});
};
}();
case 4:
rtn = 'May ';
break;
// Some common format strings
dateFormat.masks = {
"default": "ddd mmm dd yyyy HH:MM:ss",
shortDate: "m/d/yy",
mediumDate: "mmm d, yyyy",
longDate: "mmmm d, yyyy",
fullDate: "dddd, mmmm d, yyyy",
shortTime: "h:MM TT",
mediumTime: "h:MM:ss TT",
longTime: "h:MM:ss TT Z",
isoDate: "yyyy-mm-dd",
isoTime: "HH:MM:ss",
isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};
case 5:
rtn = 'Jun ';
break;
// Internationalization strings
dateFormat.i18n = {
dayNames: [
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
],
monthNames: [
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
]
};
case 6:
rtn = 'Jul ';
break;
// For convenience...
Date.prototype.format = function (mask, utc) {
return dateFormat(this, mask, utc);
};
case 7:
rtn = 'Aug ';
break;
case 8:
rtn = 'Sep ';
break;
case 9:
rtn = 'Oct ';
break;
case 10:
rtn = 'Nov ';
break;
case 11:
rtn = 'Dec ';
break;
}
rtn += date.getDate() + ' ' + date.getFullYear();
rtn += ' ' + date.getHours() + ':' + date.getMinutes();
return rtn;
}