Updating PHPCI to support new b8framework release

This commit is contained in:
Dan Cryer 2014-02-24 15:30:44 +00:00
parent a584f29316
commit 1ddce31488
10 changed files with 257 additions and 361 deletions

View file

@ -10,6 +10,7 @@
namespace PHPCI; namespace PHPCI;
use b8; use b8;
use b8\Http\Response;
use b8\Http\Response\RedirectResponse; use b8\Http\Response\RedirectResponse;
use b8\View; use b8\View;
@ -19,52 +20,38 @@ use b8\View;
*/ */
class Application extends b8\Application class Application extends b8\Application
{ {
public function init()
{
$request =& $this->request;
$route = '/:controller/:action';
$opts = ['controller' => 'Home', 'action' => 'index'];
$this->router->clearRoutes();
$this->router->register($route, $opts, function (&$route, Response &$response) use (&$request)
{
$skipValidation = in_array($route['controller'], array('session', 'webhook', 'build-status'));
if (!$skipValidation && !$this->validateSession()) {
if ($request->isAjax()) {
$response->setResponseCode(401);
$response->setContent('');
} else {
$response = new RedirectResponse($response);
$response->setHeader('Location', PHPCI_URL.'session/login');
}
return false;
}
return true;
});
}
/** /**
* Handle an incoming web request. * Handle an incoming web request.
*/ */
public function handleRequest() public function handleRequest()
{ {
try { $this->response = parent::handleRequest();
$this->initRequest();
// Validate the user's session unless it is a login/logout action or a web hook:
$sessionAction = ($this->controllerName == 'Session' && in_array($this->action, array('login', 'logout')));
$externalAction = in_array($this->controllerName, array('Bitbucket', 'Github', 'Gitlab', 'BuildStatus', 'Git'));
$skipValidation = ($externalAction || $sessionAction);
if ($skipValidation || $this->validateSession()) {
parent::handleRequest();
}
} catch (\Exception $ex) {
$content = '<h1>There was a problem with this request</h1>
<p>Please paste the details below into a
<a href="https://github.com/Block8/PHPCI/issues/new">new bug report</a>
so that we can investigate and fix it.</p>';
ob_start();
var_dump(array(
'message' => $ex->getMessage(),
'file' => $ex->getFile(),
'line' => $ex->getLine(),
'trace' => $ex->getTraceAsString()
));
var_dump(array(
'PATH_INFO' => $_SERVER['PATH_INFO'],
'REDIRECT_PATH_INFO' => $_SERVER['REDIRECT_PATH_INFO'],
'REQUEST_URI' => $_SERVER['REQUEST_URI'],
'PHP_SELF' => $_SERVER['PHP_SELF'],
'SCRIPT_NAME' => $_SERVER['SCRIPT_NAME'],
'DOCUMENT_ROOT' => $_SERVER['DOCUMENT_ROOT'],
'SCRIPT_FILENAME' => $_SERVER['SCRIPT_FILENAME'],
'SERVER_SOFTWARE' => $_SERVER['SERVER_SOFTWARE'],
));
$content .= ob_get_contents();
ob_end_clean();
$this->response->setContent($content);
$this->response->disableLayout();
}
if (View::exists('layout') && $this->response->hasLayout()) { if (View::exists('layout') && $this->response->hasLayout()) {
$view = new View('layout'); $view = new View('layout');
@ -91,14 +78,6 @@ class Application extends b8\Application
unset($_SESSION['user_id']); unset($_SESSION['user_id']);
} }
if ($this->request->isAjax()) {
$this->response->setResponseCode(401);
$this->response->setContent('');
} else {
$this->response = new RedirectResponse($this->response);
$this->response->setHeader('Location', PHPCI_URL.'session/login');
}
return false; return false;
} }
} }

View file

@ -38,7 +38,7 @@ class Controller extends \b8\Controller
if (View::exists($this->className)) { if (View::exists($this->className)) {
$this->controllerView = new View($this->className); $this->controllerView = new View($this->className);
} else { } else {
$this->controllerView = new View\UserView('{@content}'); $this->controllerView = new View\Template('{@content}');
} }
} }

View file

@ -1,67 +0,0 @@
<?php
/**
* PHPCI - Continuous Integration for PHP
*
* @copyright Copyright 2013, Block 8 Limited.
* @license https://github.com/Block8/PHPCI/blob/master/LICENSE.md
* @link http://www.phptesting.org/
*/
namespace PHPCI\Controller;
use b8;
use b8\Store;
use PHPCI\Model\Build;
/**
* BitBucket Controller - Processes webhook pings from BitBucket.
* @author Dan Cryer <dan@block8.co.uk>
* @package PHPCI
* @subpackage Web
*/
class BitbucketController extends \PHPCI\Controller
{
/**
* @var \PHPCI\Store\BuildStore
*/
protected $buildStore;
public function init()
{
$this->buildStore = Store\Factory::getStore('Build');
}
/**
* Called by Bitbucket POST service.
*/
public function webhook($project)
{
$payload = json_decode($this->getParam('payload'), true);
$branches = array();
$commits = array();
foreach ($payload['commits'] as $commit) {
if (!in_array($commit['branch'], $branches)) {
$branches[] = $commit['branch'];
$commits[$commit['branch']] = $commit['raw_node'];
}
}
foreach ($branches as $branch) {
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($commits[$branch]);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch($branch);
$this->buildStore->save($build);
} catch (\Exception $ex) {
}
}
die('OK');
}
}

View file

@ -1,69 +0,0 @@
<?php
/**
* PHPCI - Continuous Integration for PHP
*
* @copyright Copyright 2013, Block 8 Limited.
* @license https://github.com/Block8/PHPCI/blob/master/LICENSE.md
* @link http://www.phptesting.org/
*/
namespace PHPCI\Controller;
use b8;
use b8\Store;
use PHPCI\Model\Build;
/**
* @author Sami Tikka <stikka@iki.fi>
*/
class GitController extends \PHPCI\Controller
{
public function init()
{
$this->_buildStore = Store\Factory::getStore('Build');
}
/**
* Called by POSTing to /git/webhook/<project_id>?branch=<branch>&commit=<commit>
*
* @param string $project
*/
public function webhook($project)
{
$branch = $this->getParam('branch');
$commit = $this->getParam('commit');
try {
$build = new Build();
$build->setProjectId($project);
if ($branch !== null && trim($branch) !== '') {
$build->setBranch($branch);
} else {
$build->setBranch('master');
}
if ($commit !== null && trim($commit) !== '') {
$build->setCommitId($commit);
}
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$this->_buildStore->save($build);
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
}

View file

@ -1,77 +0,0 @@
<?php
/**
* PHPCI - Continuous Integration for PHP
*
* @copyright Copyright 2013, Block 8 Limited.
* @license https://github.com/Block8/PHPCI/blob/master/LICENSE.md
* @link http://www.phptesting.org/
*/
namespace PHPCI\Controller;
use b8;
use b8\Store;
use PHPCI\Model\Build;
/**
* Github Controller - Processes webhook pings from Github.
* @author Dan Cryer <dan@block8.co.uk>
* @package PHPCI
* @subpackage Web
*/
class GithubController extends \PHPCI\Controller
{
/**
* @var \PHPCI\Store\BuildStore
*/
protected $buildStore;
public function init()
{
$this->buildStore = Store\Factory::getStore('Build');
}
/**
* Called by Github Webhooks:
*/
public function webhook($project)
{
$payload = json_decode($this->getParam('payload'), true);
// Github sends a payload when you close a pull request with a
// non-existant commit. We don't want this.
if ($payload['after'] === '0000000000000000000000000000000000000000') {
die('OK');
}
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($payload['after']);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch(str_replace('refs/heads/', '', $payload['ref']));
if (!empty($payload['pusher']['email'])) {
$build->setCommitterEmail($payload['pusher']['email']);
}
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$build = $this->buildStore->save($build);
$build->sendStatusPostback();
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
}

View file

@ -1,66 +0,0 @@
<?php
/**
* PHPCI - Continuous Integration for PHP
*
* @copyright Copyright 2013, Block 8 Limited.
* @license https://github.com/Block8/PHPCI/blob/master/LICENSE.md
* @link http://www.phptesting.org/
*/
namespace PHPCI\Controller;
use b8;
use b8\Store;
use PHPCI\Model\Build;
/**
* Gitlab Controller - Processes webhook pings from Gitlab.
* @author Alex Russell <alex@clevercherry.com>, Dan Cryer <dan@block8.co.uk>
* @package PHPCI
* @subpackage Web
*/
class GitlabController extends \PHPCI\Controller
{
/**
* @var \PHPCI\Store\BuildStore
*/
protected $buildStore;
public function init()
{
$this->buildStore = Store\Factory::getStore('Build');
}
/**
* Called by Gitlab Webhooks:
*/
public function webhook($project)
{
$payload = json_decode(file_get_contents("php://input"), true);
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($payload['after']);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch(str_replace('refs/heads/', '', $payload['ref']));
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$build = $this->buildStore->save($build);
$build->sendStatusPostback();
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
}

View file

@ -0,0 +1,190 @@
<?php
/**
* PHPCI - Continuous Integration for PHP
*
* @copyright Copyright 2013, Block 8 Limited.
* @license https://github.com/Block8/PHPCI/blob/master/LICENSE.md
* @link http://www.phptesting.org/
*/
namespace PHPCI\Controller;
use b8;
use b8\Store;
use PHPCI\Model\Build;
/**
* Webhook Controller - Processes webhook pings from BitBucket, Github, Gitlab, etc.
* @author Dan Cryer <dan@block8.co.uk>
* @author Sami Tikka <stikka@iki.fi>
* @author Alex Russell <alex@clevercherry.com>
* @package PHPCI
* @subpackage Web
*/
class WebhookController extends \PHPCI\Controller
{
/**
* @var \PHPCI\Store\BuildStore
*/
protected $buildStore;
public function init()
{
$this->buildStore = Store\Factory::getStore('Build');
}
/**
* Called by Bitbucket POST service.
*/
public function bitbucket($project)
{
$payload = json_decode($this->getParam('payload'), true);
$branches = array();
$commits = array();
foreach ($payload['commits'] as $commit) {
if (!in_array($commit['branch'], $branches)) {
$branches[] = $commit['branch'];
$commits[$commit['branch']] = $commit['raw_node'];
}
}
foreach ($branches as $branch) {
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($commits[$branch]);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch($branch);
$this->buildStore->save($build);
} catch (\Exception $ex) {
}
}
die('OK');
}
/**
* Called by POSTing to /git/webhook/<project_id>?branch=<branch>&commit=<commit>
*
* @param string $project
*/
public function git($project)
{
$branch = $this->getParam('branch');
$commit = $this->getParam('commit');
try {
$build = new Build();
$build->setProjectId($project);
if ($branch !== null && trim($branch) !== '') {
$build->setBranch($branch);
} else {
$build->setBranch('master');
}
if ($commit !== null && trim($commit) !== '') {
$build->setCommitId($commit);
}
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$this->_buildStore->save($build);
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
/**
* Called by Github Webhooks:
*/
public function github($project)
{
$payload = json_decode($this->getParam('payload'), true);
// Github sends a payload when you close a pull request with a
// non-existant commit. We don't want this.
if ($payload['after'] === '0000000000000000000000000000000000000000') {
die('OK');
}
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($payload['after']);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch(str_replace('refs/heads/', '', $payload['ref']));
if (!empty($payload['pusher']['email'])) {
$build->setCommitterEmail($payload['pusher']['email']);
}
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$build = $this->buildStore->save($build);
$build->sendStatusPostback();
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
/**
* Called by Gitlab Webhooks:
*/
public function gitlab($project)
{
$payload = json_decode(file_get_contents("php://input"), true);
try {
$build = new Build();
$build->setProjectId($project);
$build->setCommitId($payload['after']);
$build->setStatus(Build::STATUS_NEW);
$build->setLog('');
$build->setCreated(new \DateTime());
$build->setBranch(str_replace('refs/heads/', '', $payload['ref']));
} catch (\Exception $ex) {
header('HTTP/1.1 400 Bad Request');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
try {
$build = $this->buildStore->save($build);
$build->sendStatusPostback();
} catch (\Exception $ex) {
header('HTTP/1.1 500 Internal Server Error');
header('Ex: ' . $ex->getMessage());
die('FAIL');
}
die('OK');
}
}

View file

@ -27,17 +27,17 @@
switch($project->getType()) switch($project->getType())
{ {
case 'github': case 'github':
$url = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://' . $_SERVER['HTTP_HOST'] . '/github/webhook/' . $project->getId(); $url = PHPCI_URL . 'webhook/github/' . $project->getId();
print ' as a "WebHook URL" in the <a href="https://github.com/' . $project->getReference() . '/settings/hooks">Service Hooks</a> section of your Github repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>'; print ' as a "WebHook URL" in the <a href="https://github.com/' . $project->getReference() . '/settings/hooks">Service Hooks</a> section of your Github repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>';
break; break;
case 'gitlab': case 'gitlab':
$url = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://' . $_SERVER['HTTP_HOST'] . '/gitlab/webhook/' . $project->getId(); $url = PHPCI_URL. 'webhook/gitlab/' . $project->getId();
print ' as a "WebHook URL" in the Web Hooks section of your Gitlab repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>'; print ' as a "WebHook URL" in the Web Hooks section of your Gitlab repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>';
break; break;
case 'bitbucket': case 'bitbucket':
$url = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://' . $_SERVER['HTTP_HOST'] . '/bitbucket/webhook/' . $project->getId(); $url = PHPCI_URL . 'webhook/bitbucket/' . $project->getId();
print ' as a "POST" service in the <a href="https://bitbucket.org/' . $project->getReference() . '/admin/services">Services</a> section of your Bitbucket repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>'; print ' as a "POST" service in the <a href="https://bitbucket.org/' . $project->getReference() . '/admin/services">Services</a> section of your Bitbucket repository.<br><br><strong style="word-wrap: break-word;">' . $url . '</strong>';
break; break;
} }

64
composer.lock generated
View file

@ -7,16 +7,16 @@
"packages": [ "packages": [
{ {
"name": "block8/b8framework", "name": "block8/b8framework",
"version": "1.0.1", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Block8/b8framework.git", "url": "https://github.com/Block8/b8framework.git",
"reference": "0497ae34ba7ef828db23b35a1f75d4debfa7eed5" "reference": "f643e0d3497599016cb62611ceb9288710423121"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Block8/b8framework/zipball/0497ae34ba7ef828db23b35a1f75d4debfa7eed5", "url": "https://api.github.com/repos/Block8/b8framework/zipball/f643e0d3497599016cb62611ceb9288710423121",
"reference": "0497ae34ba7ef828db23b35a1f75d4debfa7eed5", "reference": "f643e0d3497599016cb62611ceb9288710423121",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -50,7 +50,7 @@
"mvc", "mvc",
"php" "php"
], ],
"time": "2013-10-09 14:06:12" "time": "2014-02-24 11:25:23"
}, },
{ {
"name": "ircmaxell/password-compat", "name": "ircmaxell/password-compat",
@ -155,16 +155,16 @@
}, },
{ {
"name": "pimple/pimple", "name": "pimple/pimple",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/fabpot/Pimple.git", "url": "https://github.com/fabpot/Pimple.git",
"reference": "471c7d7c52ad6594e17b8ec33efdd1be592b5d83" "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/fabpot/Pimple/zipball/471c7d7c52ad6594e17b8ec33efdd1be592b5d83", "url": "https://api.github.com/repos/fabpot/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d",
"reference": "471c7d7c52ad6594e17b8ec33efdd1be592b5d83", "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -188,7 +188,9 @@
"authors": [ "authors": [
{ {
"name": "Fabien Potencier", "name": "Fabien Potencier",
"email": "fabien@symfony.com" "email": "fabien@symfony.com",
"homepage": "http://fabien.potencier.org",
"role": "Lead Developer"
} }
], ],
"description": "Pimple is a simple Dependency Injection Container for PHP 5.3", "description": "Pimple is a simple Dependency Injection Container for PHP 5.3",
@ -197,7 +199,7 @@
"container", "container",
"dependency injection" "dependency injection"
], ],
"time": "2013-09-19 04:53:08" "time": "2013-11-22 08:30:29"
}, },
{ {
"name": "psr/log", "name": "psr/log",
@ -288,17 +290,17 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v2.4.0", "version": "v2.4.2",
"target-dir": "Symfony/Component/Console", "target-dir": "Symfony/Component/Console",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/Console.git", "url": "https://github.com/symfony/Console.git",
"reference": "3c1496ae96d24ccc6c340fcc25f71d7a1ab4c12c" "reference": "940f217cbc3c8a33e5403e7c595495c4884400fe"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/Console/zipball/3c1496ae96d24ccc6c340fcc25f71d7a1ab4c12c", "url": "https://api.github.com/repos/symfony/Console/zipball/940f217cbc3c8a33e5403e7c595495c4884400fe",
"reference": "3c1496ae96d24ccc6c340fcc25f71d7a1ab4c12c", "reference": "940f217cbc3c8a33e5403e7c595495c4884400fe",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -328,7 +330,9 @@
"authors": [ "authors": [
{ {
"name": "Fabien Potencier", "name": "Fabien Potencier",
"email": "fabien@symfony.com" "email": "fabien@symfony.com",
"homepage": "http://fabien.potencier.org",
"role": "Lead Developer"
}, },
{ {
"name": "Symfony Community", "name": "Symfony Community",
@ -337,21 +341,21 @@
], ],
"description": "Symfony Console Component", "description": "Symfony Console Component",
"homepage": "http://symfony.com", "homepage": "http://symfony.com",
"time": "2013-11-27 09:10:40" "time": "2014-02-11 13:52:09"
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v2.4.0", "version": "v2.4.2",
"target-dir": "Symfony/Component/Yaml", "target-dir": "Symfony/Component/Yaml",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/Yaml.git", "url": "https://github.com/symfony/Yaml.git",
"reference": "1ae235a1b9d3ad3d9f3860ff20acc072df95b7f5" "reference": "bb6ddaf8956139d1b8c360b4b713ed0138e876b3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/Yaml/zipball/1ae235a1b9d3ad3d9f3860ff20acc072df95b7f5", "url": "https://api.github.com/repos/symfony/Yaml/zipball/bb6ddaf8956139d1b8c360b4b713ed0138e876b3",
"reference": "1ae235a1b9d3ad3d9f3860ff20acc072df95b7f5", "reference": "bb6ddaf8956139d1b8c360b4b713ed0138e876b3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -375,7 +379,9 @@
"authors": [ "authors": [
{ {
"name": "Fabien Potencier", "name": "Fabien Potencier",
"email": "fabien@symfony.com" "email": "fabien@symfony.com",
"homepage": "http://fabien.potencier.org",
"role": "Lead Developer"
}, },
{ {
"name": "Symfony Community", "name": "Symfony Community",
@ -384,22 +390,22 @@
], ],
"description": "Symfony Yaml Component", "description": "Symfony Yaml Component",
"homepage": "http://symfony.com", "homepage": "http://symfony.com",
"time": "2013-11-26 16:40:27" "time": "2014-01-07 13:28:54"
} }
], ],
"packages-dev": [ "packages-dev": [
{ {
"name": "phpspec/prophecy", "name": "phpspec/prophecy",
"version": "v1.0.4", "version": "1.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpspec/prophecy.git", "url": "https://github.com/phpspec/prophecy.git",
"reference": "79d9c8bd94801bffbf9b56964f6438762da6d8cd" "reference": "976a65af02a2a0e17ce6c949f7b43437205628bb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/79d9c8bd94801bffbf9b56964f6438762da6d8cd", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/976a65af02a2a0e17ce6c949f7b43437205628bb",
"reference": "79d9c8bd94801bffbf9b56964f6438762da6d8cd", "reference": "976a65af02a2a0e17ce6c949f7b43437205628bb",
"shasum": "" "shasum": ""
}, },
"require-dev": { "require-dev": {
@ -408,7 +414,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.0.x-dev" "dev-master": "1.1.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -441,7 +447,7 @@
"spy", "spy",
"stub" "stub"
], ],
"time": "2013-08-10 11:11:45" "time": "2014-01-24 11:03:43"
}, },
{ {
"name": "phpspec/prophecy-phpunit", "name": "phpspec/prophecy-phpunit",

0
console Normal file → Executable file
View file