1
0
Fork 0

using theirs

pull/2184/merge^2
matt-whittom 2013-08-13 10:54:35 -05:00 committed by mwhittom
parent bab10dd9f8
commit 1019c014e5
7 changed files with 221 additions and 154 deletions

View File

@ -30,7 +30,8 @@
"symfony/process": "~2.1" "symfony/process": "~2.1"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~3.7.10" "phpunit/phpunit": "~3.7.10",
"mikey179/vfsStream" : "1.2.*"
}, },
"suggest": { "suggest": {
"ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic", "ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic",

63
composer.lock generated
View File

@ -3,7 +3,7 @@
"This file locks the dependencies of your project to a known state", "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" "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
], ],
"hash": "370b764a9317165e8ea7a2e1623e031b", "hash": "6203fdb419c10ffd84f85611fc9eec61",
"packages": [ "packages": [
{ {
"name": "justinrainbow/json-schema", "name": "justinrainbow/json-schema",
@ -79,17 +79,17 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v2.3.3", "version": "dev-master",
"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": "v2.3.3" "reference": "872a494b88fba2f62be85e0bc8441e7946bb6ba6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/Console/zipball/v2.3.3", "url": "https://api.github.com/repos/symfony/Console/zipball/872a494b88fba2f62be85e0bc8441e7946bb6ba6",
"reference": "v2.3.3", "reference": "872a494b88fba2f62be85e0bc8441e7946bb6ba6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -104,7 +104,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.3-dev" "dev-master": "2.4-dev"
} }
}, },
"autoload": { "autoload": {
@ -128,7 +128,7 @@
], ],
"description": "Symfony Console Component", "description": "Symfony Console Component",
"homepage": "http://symfony.com", "homepage": "http://symfony.com",
"time": "2013-07-21 12:12:18" "time": "2013-08-09 06:00:31"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
@ -179,17 +179,17 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v2.3.3", "version": "dev-master",
"target-dir": "Symfony/Component/Process", "target-dir": "Symfony/Component/Process",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/Process.git", "url": "https://github.com/symfony/Process.git",
"reference": "v2.3.3" "reference": "723fe405fcc878ae75469babcb9507d292797ece"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/Process/zipball/v2.3.3", "url": "https://api.github.com/repos/symfony/Process/zipball/723fe405fcc878ae75469babcb9507d292797ece",
"reference": "v2.3.3", "reference": "723fe405fcc878ae75469babcb9507d292797ece",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -198,7 +198,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "2.3-dev" "dev-master": "2.4-dev"
} }
}, },
"autoload": { "autoload": {
@ -222,10 +222,40 @@
], ],
"description": "Symfony Process Component", "description": "Symfony Process Component",
"homepage": "http://symfony.com", "homepage": "http://symfony.com",
"time": "2013-08-02 21:51:01" "time": "2013-08-09 07:03:52"
} }
], ],
"packages-dev": [ "packages-dev": [
{
"name": "mikey179/vfsStream",
"version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/mikey179/vfsStream.git",
"reference": "v1.2.0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mikey179/vfsStream/zipball/v1.2.0",
"reference": "v1.2.0",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"autoload": {
"psr-0": {
"org\\bovigo\\vfs\\": "src/main/php"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD"
],
"homepage": "http://vfs.bovigo.org/",
"time": "2013-04-01 10:41:02"
},
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "1.2.12", "version": "1.2.12",
@ -645,9 +675,10 @@
], ],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [ "stability-flags": {
"symfony/console": 20,
], "symfony/process": 20
},
"platform": { "platform": {
"php": ">=5.3.2" "php": ">=5.3.2"
}, },

View File

@ -13,6 +13,7 @@
namespace Composer\Downloader; namespace Composer\Downloader;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Repository\VcsRepository;
use Composer\Util\Perforce; use Composer\Util\Perforce;
/** /**
@ -20,6 +21,8 @@ use Composer\Util\Perforce;
*/ */
class PerforceDownloader extends VcsDownloader class PerforceDownloader extends VcsDownloader
{ {
protected $perforce;
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -28,30 +31,29 @@ class PerforceDownloader extends VcsDownloader
$ref = $package->getSourceReference(); $ref = $package->getSourceReference();
$label = $package->getPrettyVersion(); $label = $package->getPrettyVersion();
$this->initPerforce($package, $path);
$this->perforce->setStream($ref);
$this->perforce->queryP4User($this->io);
$this->perforce->writeP4ClientSpec();
$this->perforce->connectClient();
$this->perforce->syncCodeBase($label);
}
private function initPerforce($package, $path){
if (isset($this->perforce)){
return;
}
$repository = $package->getRepository(); $repository = $package->getRepository();
//assume repository is a Perforce Repository $repoConfig = $this->getRepoConfig($repository);
$this->perforce = new Perforce($repoConfig, $package->getSourceUrl(), $path);
}
$reflector = new \ReflectionClass($repository); public function injectPerforce($perforce){
$repoConfigProperty = $reflector->getProperty("repoConfig"); $this->perforce = $perforce;
$repoConfigProperty->setAccessible(true); }
$repoConfig = $repoConfigProperty->getValue($repository);
$p4user = ""; private function getRepoConfig(VcsRepository $repository){
if (isset($repoConfig['p4user'])) { return $repository->getRepoConfig();
$p4user = $repoConfig['p4user'];
}
$p4password = "";
if (isset($repoConfig['p4password'])) {
$p4password = $repoConfig['p4password'];
}
// print("Perforce Downloader:doDownload - repoConfig:" . var_dump($repoConfig, true) . "\n\n");
$perforce = new Perforce("", "", $package->getSourceUrl(), $path, null, $p4user, $p4password);
$perforce->setStream($ref);
$perforce->queryP4User($this->io);
$perforce->writeP4ClientSpec();
$perforce->connectClient();
$perforce->syncCodeBase($label);
} }
/** /**

View File

@ -32,25 +32,13 @@ class PerforceDriver extends VcsDriver {
* {@inheritDoc} * {@inheritDoc}
*/ */
public function initialize() { public function initialize() {
$this->depot = $this->repoConfig['depot']; $this->depot = $this->repoConfig['depot'];
$this->branch = ""; $this->branch = "";
if (isset($this->repoConfig['branch'])) { if (isset($this->repoConfig['branch'])) {
$this->branch = $this->repoConfig['branch']; $this->branch = $this->repoConfig['branch'];
} }
$p4user = "";
if (isset($this->repoConfig['p4user'])) {
$p4user = $this->repoConfig['p4user'];
}
$p4password = "";
if (isset($this->repoConfig['p4password'])) {
$p4password = $this->repoConfig['p4password'];
}
$repoDir = $this->config->get('cache-vcs-dir') . "/$this->depot";
if (!isset($this->perforce)) {
$this->perforce = new Perforce($this->depot, $this->branch, $this->getUrl(), $repoDir, $this->process, $p4user, $p4password);
}
$this->initPerforce();
$this->perforce->p4Login($this->io); $this->perforce->p4Login($this->io);
$this->perforce->checkStream($this->depot); $this->perforce->checkStream($this->depot);
@ -60,6 +48,15 @@ class PerforceDriver extends VcsDriver {
return TRUE; return TRUE;
} }
private function initPerforce() {
if (isset($this->perforce)) {
return;
}
$repoDir = $this->config->get('cache-vcs-dir') . "/$this->depot";
$this->perforce = new Perforce($this->repoConfig, $this->getUrl(), $repoDir, $this->process);
}
public function injectPerforce(Perforce $perforce) { public function injectPerforce(Perforce $perforce) {
$this->perforce = $perforce; $this->perforce = $perforce;
} }
@ -95,6 +92,7 @@ class PerforceDriver extends VcsDriver {
*/ */
public function getTags() { public function getTags() {
$tags = $this->perforce->getTags(); $tags = $this->perforce->getTags();
return $tags; return $tags;
} }

View File

@ -59,6 +59,11 @@ class VcsRepository extends ArrayRepository
$this->repoConfig = $repoConfig; $this->repoConfig = $repoConfig;
} }
public function getRepoConfig()
{
return $this->repoConfig;
}
public function setLoader(LoaderInterface $loader) public function setLoader(LoaderInterface $loader)
{ {
$this->loader = $loader; $this->loader = $loader;

View File

@ -25,21 +25,27 @@ class Perforce {
protected $p4branch; protected $p4branch;
protected $process; protected $process;
public function __construct($depot, $branch, $port, $path, ProcessExecutor $process = null, $p4user = null, $p4password = null) { public function __construct($repoConfig, $port, $path, ProcessExecutor $process = NULL) {
$this->p4depot = $depot;
$this->p4branch = $branch;
$this->p4port = $port; $this->p4port = $port;
$this->path = $path; $this->path = $path;
$this->process = $process ? : new ProcessExecutor; $this->process = $process ? : new ProcessExecutor;
$fs = new Filesystem(); $fs = new Filesystem();
$fs->ensureDirectoryExists($path); $fs->ensureDirectoryExists($path);
if (isset($p4user)){
$this->p4user = $p4user; if (isset($repoConfig['depot'])) {
} else { $this->p4depot = $repoConfig['depot'];
}
if (isset($repoConfig['branch'])) {
$this->p4branch = $repoConfig['branch'];
}
if (isset($repoConfig['p4user'])) {
$this->p4user = $repoConfig['p4user'];
}
else {
$this->p4user = $this->getP4variable("P4USER"); $this->p4user = $this->getP4variable("P4USER");
} }
if (isset($p4password)){ if (isset($repoConfig['p4password'])) {
$this->p4password = $p4password; $this->p4password = $repoConfig['p4password'];
} }
} }
@ -47,6 +53,10 @@ class Perforce {
return mt_rand(1000, 9999); return mt_rand(1000, 9999);
} }
protected function isWindows(){
return defined('PHP_WINDOWS_VERSION_BUILD');
}
protected function executeCommand($command) { protected function executeCommand($command) {
$result = ""; $result = "";
$this->process->execute($command, $result); $this->process->execute($command, $result);
@ -72,6 +82,10 @@ class Perforce {
return $this->p4port; return $this->p4port;
} }
protected function isStream() {
return (strcmp($this->p4depotType, "stream") === 0);
}
protected function getStream() { protected function getStream() {
if (!isset($this->p4stream)) { if (!isset($this->p4stream)) {
if ($this->isStream()) { if ($this->isStream()) {
@ -107,45 +121,54 @@ class Perforce {
public function queryP4User(IOInterface $io) { public function queryP4User(IOInterface $io) {
$this->getUser(); $this->getUser();
if (strlen($this->p4user) <= 0) { if (strlen($this->p4user) > 0) {
$this->p4user = $io->ask("Enter P4 User:"); return;
if (defined('PHP_WINDOWS_VERSION_BUILD')) {
$command = "p4 set P4USER=$this->p4user";
} else {
$command = "export P4USER=$this->p4user";
}
$result = $this->executeCommand($command);
} }
$this->p4user = $this->getP4variable("P4USER");
if (strlen($this->p4user) > 0) {
return;
}
$this->p4user = $io->ask("Enter P4 User:");
if ($this->isWindows()) {
$command = "p4 set P4USER=$this->p4user";
}
else {
$command = "export P4USER=$this->p4user";
}
$result = $this->executeCommand($command);
} }
protected function getP4variable($name){ protected function getP4variable($name) {
if (defined('PHP_WINDOWS_VERSION_BUILD')) { if ($this->isWindows()) {
$command = "p4 set"; $command = "p4 set";
$result = $this->executeCommand($command); $result = $this->executeCommand($command);
$resArray = explode("\n", $result); $resArray = explode("\n", $result);
foreach ($resArray as $line) { foreach ($resArray as $line) {
$fields = explode("=", $line); $fields = explode("=", $line);
if (strcmp($name, $fields[0]) == 0){ if (strcmp($name, $fields[0]) == 0) {
$index = strpos($fields[1], " "); $index = strpos($fields[1], " ");
if ($index === false){ if ($index === FALSE) {
$value = $fields[1]; $value = $fields[1];
} else { }
else {
$value = substr($fields[1], 0, $index); $value = substr($fields[1], 0, $index);
} }
$value = trim($value); $value = trim($value);
return $value; return $value;
} }
} }
} else { }
else {
$command = 'echo $' . $name; $command = 'echo $' . $name;
$result = trim($this->executeCommand($command)); $result = trim($this->executeCommand($command));
return $result; return $result;
} }
} }
protected function queryP4Password(IOInterface $io) { protected function queryP4Password(IOInterface $io) {
if (isset($this->p4password)){ if (isset($this->p4password)) {
return $this->p4password; return $this->p4password;
} }
$password = $this->getP4variable("P4PASSWD"); $password = $this->getP4variable("P4PASSWD");
@ -153,11 +176,8 @@ class Perforce {
$password = $io->askAndHideAnswer("Enter password for Perforce user " . $this->getUser() . ": "); $password = $io->askAndHideAnswer("Enter password for Perforce user " . $this->getUser() . ": ");
} }
$this->p4password = $password; $this->p4password = $password;
return $password;
}
protected function isStream() { return $password;
return (strcmp($this->p4depotType, "stream") === 0);
} }
protected function generateP4Command($command, $useClient = TRUE) { protected function generateP4Command($command, $useClient = TRUE) {
@ -179,6 +199,7 @@ class Perforce {
if ($index === FALSE) { if ($index === FALSE) {
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
@ -245,18 +266,19 @@ class Perforce {
} }
protected function read($pipe, $name){ protected function read($pipe, $name) {
if (feof($pipe)) { if (feof($pipe)) {
return; return;
} }
$line = fgets($pipe); $line = fgets($pipe);
while ($line != false){ while ($line != FALSE) {
$line = fgets($pipe); $line = fgets($pipe);
} }
return; return;
} }
public function windowsLogin($password){ public function windowsLogin($password) {
$descriptorspec = array( $descriptorspec = array(
0 => array("pipe", "r"), 0 => array("pipe", "r"),
1 => array("pipe", "w"), 1 => array("pipe", "w"),
@ -264,8 +286,8 @@ class Perforce {
); );
$command = $this->generateP4Command(" login -a"); $command = $this->generateP4Command(" login -a");
$process = proc_open($command, $descriptorspec, $pipes); $process = proc_open($command, $descriptorspec, $pipes);
if (!is_resource($process)){ if (!is_resource($process)) {
return false; return FALSE;
} }
fwrite($pipes[0], $password); fwrite($pipes[0], $password);
fclose($pipes[0]); fclose($pipes[0]);
@ -286,10 +308,11 @@ class Perforce {
$this->queryP4User($io); $this->queryP4User($io);
if (!$this->isLoggedIn()) { if (!$this->isLoggedIn()) {
$password = $this->queryP4Password($io); $password = $this->queryP4Password($io);
if (defined('PHP_WINDOWS_VERSION_BUILD')) { if ($this->isWindows()) {
$this->windowsLogin($password); $this->windowsLogin($password);
} else { }
$command = "echo $password | ".$this->generateP4Command(" login -a", false); else {
$command = "echo $password | " . $this->generateP4Command(" login -a", FALSE);
$this->executeCommand($command); $this->executeCommand($command);
} }
} }
@ -392,6 +415,7 @@ class Perforce {
$tags[$fields[1]] = $this->getStream() . "@" . $fields[1]; $tags[$fields[1]] = $this->getStream() . "@" . $fields[1];
} }
} }
return $tags; return $tags;
} }

View File

@ -14,97 +14,103 @@
namespace Composer\Test\Repository\Vcs; namespace Composer\Test\Repository\Vcs;
#use Composer\Downloader\TransportException;
use Composer\Repository\Vcs\PerforceDriver; use Composer\Repository\Vcs\PerforceDriver;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Config; use Composer\Config;
use Composer\IO\ConsoleIO;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Helper\HelperSet;
class PerforceDriverTest extends \PHPUnit_Framework_TestCase class PerforceDriverTest extends \PHPUnit_Framework_TestCase {
{
private $config; private $config;
private $io; private $io;
private $process;
private $remoteFileSystem;
private $testPath;
public function setUp() public function setUp() {
{ $this->testPath = sys_get_temp_dir() . '/composer-test';
$this->config = new Config(); $this->config = new Config();
$this->config->merge(array( $this->config->merge(
'config' => array( array(
'home' => sys_get_temp_dir() . '/composer-test', 'config' => array(
), 'home' => $this->testPath,
)); ),
$inputParameters = array(); )
$input = new ArrayInput($inputParameters); );
$output = new ConsoleOutput();
$helperSet = new HelperSet(); $this->io = $this->getMock('Composer\IO\IOInterface');
$this->io = new ConsoleIO($input, $output, $helperSet); $this->process = $this->getMock('Composer\Util\ProcessExecutor');
$this->remoteFileSystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')->disableOriginalConstructor()->getMock();
} }
public function tearDown() public function tearDown() {
{
$fs = new Filesystem; $fs = new Filesystem;
$fs->removeDirectory(sys_get_temp_dir() . '/composer-test'); $fs->removeDirectory($this->testPath);
} }
public function testPrivateRepository() //Test:
{ //hasComposerFile
$repo_config = array(
'url' => "perforce.vuhl.root.mrc.local:3710",
'depot' => "lighthouse"
);
$vcs = new PerforceDriver($repo_config, $this->io, $this->config); public function testInitializeCapturesVariablesFromRepoConfig() {
$result = $vcs->initialize(); $this->setUp();
$this->assertTrue($result); $repo_config = array(
'url' => 'TEST_PERFORCE_URL',
'depot' => 'TEST_DEPOT_CONFIG',
'branch' => 'TEST_BRANCH_CONFIG'
);
$driver = new TestingPerforceDriver($repo_config, $this->io, $this->config, $this->process, $this->remoteFileSystem);
$arguments = array(array('depot'=>'TEST_DEPOT', 'branch'=>'TEST_BRANCH'), 'port'=>'TEST_PORT', 'path'=>$this->testPath);
$perforce = $this->getMock('Composer\Util\Perforce', null, $arguments);
$driver->injectPerforce($perforce);
$driver->initialize();
$this->assertEquals("TEST_PERFORCE_URL", $driver->getUrl());
$this->assertEquals("TEST_DEPOT_CONFIG", $driver->getDepot());
$this->assertEquals("TEST_BRANCH_CONFIG", $driver->getBranch());
} }
public function testGetTags() public function testInitializeLogsInAndConnectsClient() {
{ $this->setUp();
$repo_config = array( $repo_config = array(
'url' => "perforce.vuhl.root.mrc.local:3710", 'url' => 'TEST_PERFORCE_URL',
'depot' => "lighthouse" 'depot' => 'TEST_DEPOT_CONFIG',
'branch' => 'TEST_BRANCH_CONFIG'
); );
$driver = new TestingPerforceDriver($repo_config, $this->io, $this->config, $this->process, $this->remoteFileSystem);
$perforce = $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock();
$perforce->expects($this->at(0))
->method('p4Login')
->with($this->io);
$perforce->expects($this->at(1))
->method('checkStream')
->with($this->equalTo("TEST_DEPOT_CONFIG"));
$perforce->expects($this->at(2))
->method('writeP4ClientSpec');
$perforce->expects($this->at(3))
->method('connectClient');
$vcs = new PerforceDriver($repo_config, $this->io, $this->config); $driver->injectPerforce($perforce);
$result = $vcs->initialize(); $driver->initialize();
$this->assertTrue($result);
$tags = $vcs->getTags();
$this->assertTrue(empty($tags));
} }
public function testGetSource() public function testHasComposerFile() {
{ $this->setUp();
$repo_config = array( $repo_config = array(
'url' => "perforce.vuhl.root.mrc.local:3710", 'url' => 'TEST_PERFORCE_URL',
'depot' => "lighthouse" 'depot' => 'TEST_DEPOT_CONFIG',
'branch' => 'TEST_BRANCH_CONFIG'
); );
$driver = new TestingPerforceDriver($repo_config, $this->io, $this->config, $this->process, $this->remoteFileSystem);
$vcs = new PerforceDriver($repo_config, $this->io, $this->config); $arguments = array(array('depot'=>'TEST_DEPOT', 'branch'=>'TEST_BRANCH'), 'port'=>'TEST_PORT', 'path'=>$this->testPath);
$result = $vcs->initialize(); $perforce = $this->getMock('Composer\Util\Perforce', array('getComposerInformation'), $arguments);
$perforce->expects($this->at(0))
->method('getComposerInformation')
->with($this->equalTo("//TEST_DEPOT_CONFIG/TEST_IDENTIFIER"))
->will($this->returnValue("Some json stuff"));
$driver->injectPerforce($perforce);
$driver->initialize();
$identifier = "TEST_IDENTIFIER";
$result = $driver->hasComposerFile($identifier);
$this->assertTrue($result); $this->assertTrue($result);
$identifier = $vcs->getRootIdentifier();
$source = $vcs->getSource($identifier);
$this->assertEquals($source['type'], "perforce");
$this->assertEquals($source['reference'], $identifier);
}
public function testGetDist()
{
$repo_config = array(
'url' => "perforce.vuhl.root.mrc.local:3710",
'depot' => "lighthouse"
);
$vcs = new PerforceDriver($repo_config, $this->io, $this->config);
$result = $vcs->initialize();
$this->assertTrue($result);
$identifier = $vcs->getRootIdentifier();
$dist = $vcs->getDist($identifier);
$this->assertNull($dist);
} }
} }