1
0
Fork 0

Cleaned up perforce code

Checks to see if already logged in to Perforce, and prompts for password if not and P4PASSWD is not set
Checks server url with perforce call
Checks for composer.json file, and returns the contents of the file already retrieved.
pull/2184/merge^2
matt-whittom 2013-07-25 15:25:09 -05:00 committed by mwhittom
parent 0d061f2530
commit 36dd7dfea5
3 changed files with 138 additions and 156 deletions

View File

@ -14,8 +14,6 @@ namespace Composer\Downloader;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Util\Perforce; use Composer\Util\Perforce;
#use Composer\Util\GitHub;
#use Composer\Util\Git as GitUtil;
/** /**
* @author Jordi Boggiano <j.boggiano@seld.be> * @author Jordi Boggiano <j.boggiano@seld.be>
@ -29,16 +27,11 @@ class PerforceDownloader extends VcsDownloader
*/ */
public function doDownload(PackageInterface $package, $path) public function doDownload(PackageInterface $package, $path)
{ {
print ("Perforce Downloader:doDownload - path:" . var_export($path, true) . "\n");
$ref = $package->getSourceReference(); $ref = $package->getSourceReference();
$p4client = "composer_perforce_dl_" . str_replace("/", "_", str_replace("//", "", $ref));
$clientSpec = "$path/$p4client.p4.spec"; $perforce = new Perforce($ref, $package->getSourceUrl(), $path);
print ("PerforceDownloader:doDownload - clientSpec: $clientSpec, targetDir: $path, p4Client: $p4client\n\n"); $perforce->writeP4ClientSpec();
$perforce = new Perforce(); $perforce->syncCodeBase();
$perforce->writeP4ClientSpec($clientSpec, $path, $p4client, $ref);
$perforce->syncCodeBase($clientSpec, $path, $p4client);
} }
/** /**
@ -47,26 +40,6 @@ class PerforceDownloader extends VcsDownloader
public function doUpdate(PackageInterface $initial, PackageInterface $target, $path) public function doUpdate(PackageInterface $initial, PackageInterface $target, $path)
{ {
print("PerforceDownloader:doUpdate\n"); print("PerforceDownloader:doUpdate\n");
// $this->cleanEnv();
// $path = $this->normalizePath($path);
//
// $ref = $target->getSourceReference();
// $this->io->write(" Checking out ".$ref);
// $command = 'git remote set-url composer %s && git fetch composer && git fetch --tags composer';
//
// // capture username/password from URL if there is one
// $this->process->execute('git remote -v', $output, $path);
// if (preg_match('{^(?:composer|origin)\s+https?://(.+):(.+)@([^/]+)}im', $output, $match)) {
// $this->io->setAuthentication($match[3], urldecode($match[1]), urldecode($match[2]));
// }
//
// $commandCallable = function($url) use ($command) {
// return sprintf($command, escapeshellarg($url));
// };
//
// $this->runCommand($commandCallable, $target->getSourceUrl(), $path);
// $this->updateToCommit($path, $ref, $target->getPrettyVersion(), $target->getReleaseDate());
} }
/** /**
@ -75,18 +48,6 @@ class PerforceDownloader extends VcsDownloader
public function getLocalChanges($path) public function getLocalChanges($path)
{ {
print("PerforceDownloader:getLocalChanges\n"); print("PerforceDownloader:getLocalChanges\n");
// $this->cleanEnv();
// $path = $this->normalizePath($path);
// if (!is_dir($path.'/.git')) {
// return;
// }
//
// $command = 'git status --porcelain --untracked-files=no';
// if (0 !== $this->process->execute($command, $output, $path)) {
// throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
// }
//
// return trim($output) ?: null;
} }
@ -96,14 +57,6 @@ class PerforceDownloader extends VcsDownloader
protected function getCommitLogs($fromReference, $toReference, $path) protected function getCommitLogs($fromReference, $toReference, $path)
{ {
print("PerforceDownloader:getCommitLogs\n"); print("PerforceDownloader:getCommitLogs\n");
// $path = $this->normalizePath($path);
// $command = sprintf('git log %s..%s --pretty=format:"%%h - %%an: %%s"', $fromReference, $toReference);
//
// if (0 !== $this->process->execute($command, $output, $path)) {
// throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
// }
//
// return $output;
} }
} }

View File

@ -15,62 +15,39 @@
namespace Composer\Repository\Vcs; namespace Composer\Repository\Vcs;
#use Composer\Downloader\TransportException;
#use Composer\Json\JsonFile;
#use Composer\Cache;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Perforce; use Composer\Util\Perforce;
#use Composer\Util\RemoteFilesystem;
#use Composer\Util\GitHub;
/** /**
* @author matt-whittom <> * @author matt-whittom <>
*/ */
class PerforceDriver extends VcsDriver class PerforceDriver extends VcsDriver
{ {
// protected $cache; protected $rootIdentifier;
// protected $owner;
// protected $repository;
// protected $tags;
// protected $branches;
protected $rootIdentifier = 'mainline';
protected $repoDir;
// protected $hasIssues;
// protected $infoCache = array();
// protected $isPrivate = false;
protected $depot; protected $depot;
protected $p4client; protected $perforce;
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function initialize() public function initialize()
{ {
print ("PerforceDriver:initialize\n"); print ("\nPerforceDriver:initialize\n");
$this->rootIdentifier = "mainline";
$this->depot = $this->repoConfig['depot']; $this->depot = $this->repoConfig['depot'];
$this->p4client = "composer_perforce_$this->depot";
$this->repoDir = $this->config->get('cache-vcs-dir') . "/$this->depot";
$clientSpec = $this->config->get('cache-dir') . "/perforce/$this->p4client.p4.spec";
$this->p4Login();
$fs = new Filesystem();
$fs->ensureDirectoryExists($this->repoDir);
$stream = "//$this->depot/$this->rootIdentifier"; $stream = "//$this->depot/$this->rootIdentifier";
$perforce = new Perforce(); $repoDir = $this->config->get('cache-vcs-dir') . "/$this->depot";
$perforce->writeP4ClientSpec($clientSpec, $this->repoDir, $this->p4client, $stream); $this->perforce = new Perforce($stream, $this->getUrl(), $repoDir);
$perforce->syncCodeBase($clientSpec, $this->repoDir, $this->p4client);
$this->perforce->p4Login($this->io);
$this->perforce->writeP4ClientSpec();
$this->perforce->syncCodeBase();
return true; return true;
} }
protected function p4Login(){
$password = trim(shell_exec('echo $P4PASSWD'));
$command = "echo $password | p4 login -a ";
shell_exec($command);
}
@ -79,33 +56,11 @@ class PerforceDriver extends VcsDriver
*/ */
public function getComposerInformation($identifier) public function getComposerInformation($identifier)
{ {
print ("PerforceDriver:getComposerInformation: $identifier\n"); print ("PerforceDriver:getComposerInformation - identifier: $identifier\n");
$command = "p4 print $identifier/composer.json"; $composer_info =$this->perforce->getComposerInformation($identifier);
$result = shell_exec($command);
$index = strpos($result, "{");
if ($index === false){
return;
}
if ($index >=0){
$rawData = substr($result, $index);
$composer_info = json_decode($rawData, true);
print ("ComposerInfo is:".var_export($composer_info, true) . "\n");
return $composer_info; return $composer_info;
} }
// Basically, read the composer.json file from the project.
//
// Git stuff:
// ..getComposerInfo is: array (
// 'support' =>
// array (
// 'source' => 'http://github.com/composer/packagist',
// ),
// 'time' => '2012-09-10',
// )
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -120,9 +75,6 @@ class PerforceDriver extends VcsDriver
*/ */
public function getBranches() public function getBranches()
{ {
//return $branch->$identifier
//getComposer($identifier)
//validate($branch)
print ("PerforceDriver:getBranches\n"); print ("PerforceDriver:getBranches\n");
$command = "p4 streams //$this->depot/..."; $command = "p4 streams //$this->depot/...";
$result = shell_exec($command); $result = shell_exec($command);
@ -137,7 +89,6 @@ class PerforceDriver extends VcsDriver
} }
} }
$branches['master'] = $branches['mainline']; $branches['master'] = $branches['mainline'];
print ("PerforceDriver:getBranches - returning branches:".var_export($branches, true)."\n");
return $branches; return $branches;
} }
@ -155,7 +106,7 @@ class PerforceDriver extends VcsDriver
*/ */
public function getDist($identifier) public function getDist($identifier)
{ {
print ("PerforceDriver:getDist: $identifier\n"); print("\nPerforceDriver:getDist: identifier: $identifier\n");
return null; return null;
} }
@ -164,7 +115,7 @@ class PerforceDriver extends VcsDriver
*/ */
public function getSource($identifier) public function getSource($identifier)
{ {
print ("PerforceDriver:getSource: $identifier\n"); print ("\nPerforceDriver:getSource - identifier: $identifier\n");
$source = array ( $source = array (
'type' => 'perforce', 'type' => 'perforce',
@ -180,7 +131,7 @@ class PerforceDriver extends VcsDriver
public function getUrl() public function getUrl()
{ {
print ("PerforceDriver:getUrl\n"); print ("PerforceDriver:getUrl\n");
return $this->url;
} }
/** /**
@ -188,10 +139,10 @@ class PerforceDriver extends VcsDriver
*/ */
public function hasComposerFile($identifier) public function hasComposerFile($identifier)
{ {
print ("PerforceDriver:hasComposerFile: $identifier\n"); print ("\nPerforceDriver:hasComposerFile - identifier: $identifier\n");
$composerFile = $this->perforce->getComposerFilePath($identifier);
//Does the project have a composer file? print ("returning: " . var_export(file_exists($composerFile),true) . "\n");
return true; return file_exists($composerFile);
} }
/** /**
@ -199,7 +150,8 @@ class PerforceDriver extends VcsDriver
*/ */
public function getContents($url) public function getContents($url)
{ {
print("PerforceDriver:getContents - url: $url"); print ("\nPerforceDriver:getContents - url: $url\n");
return false;
} }
/** /**
@ -207,12 +159,7 @@ class PerforceDriver extends VcsDriver
*/ */
public static function supports(IOInterface $io, $url, $deep = false) public static function supports(IOInterface $io, $url, $deep = false)
{ {
print ("PerforceDriver:supports\n"); print ("PerforceDriver:supports - url: $url\n");
return Perforce::checkServerExists($url);
print ("\nChecking url for support: $url\n\n");
if (preg_match('#(^perforce)#', $url)) {
return true;
}
return false;
} }
} }

View File

@ -9,56 +9,93 @@
namespace Composer\Util; namespace Composer\Util;
use Composer\IO\IOInterface;
class Perforce { class Perforce {
public function syncCodeBase($clientSpec, $targetDir, $p4client){
$p4CreateClientCommand = "p4 client -i < $clientSpec"; protected $path;
print ("\nPerforceDriver create client: $p4CreateClientCommand\n"); protected $p4client;
protected $p4user;
protected $p4port;
protected $p4stream;
protected $p4clientSpec;
final public function __construct($stream, $port, $path){
$this->p4stream = $stream;
$this->p4port = $port;
$this->path = $path;
$fs = new Filesystem();
$fs->ensureDirectoryExists($path);
}
protected function getClient()
{
if (!isset($this->p4client)){
$random_value = mt_rand(1000,9999);
$this->p4client = "composer_perforce_" . $random_value . "_".str_replace("/", "_", str_replace("//", "", $this->p4stream));
}
return $this->p4client;
}
protected function getUser()
{
if (!isset($this->p4user)){
$this->p4user = trim(shell_exec('echo $P4USER'));
}
return $this->p4user;
}
protected function getPath()
{
return $this->path;
}
protected function getPort()
{
return $this->p4port;
}
protected function getStream()
{
return $this->p4stream;
}
protected function getP4ClientSpec()
{
$p4clientSpec = $this->path . "/" . $this->getClient() . ".p4.spec";
return $p4clientSpec;
}
public function syncCodeBase(){
$p4CreateClientCommand = $this->generateP4Command( "client -i < " . $this->getP4ClientSpec());
$result = shell_exec($p4CreateClientCommand); $result = shell_exec($p4CreateClientCommand);
print ("result: $result\n\n");
$prevDir = getcwd(); $prevDir = getcwd();
chdir($targetDir); chdir($this->path);
//write p4 config file $result = shell_exec("pwd");
$p4ConfigFileSpec = "$targetDir/p4config.config";
$p4ConfigFile = fopen($p4ConfigFileSpec, 'w');
fwrite($p4ConfigFile, "P4CLIENT=$p4client");
fclose($p4ConfigFile);
$testCommand = "pwd"; $p4SyncCommand = $this->generateP4Command( "sync -f //".$this->getClient()."/...");
print ("PerforceDriver test dir command: $testCommand\n");
$result = shell_exec($testCommand);
print ("result: $result\n\n");
$p4SyncCommand = "p4 sync -f //$p4client/...";
print ("PerforceDriver sync client: $p4SyncCommand\n");
$result = shell_exec($p4SyncCommand); $result = shell_exec($p4SyncCommand);
print ("result: $result\n\n");
chdir($prevDir); chdir($prevDir);
} }
public function writeP4ClientSpec($clientSpec, $targetDir, $p4client, $stream){ public function writeP4ClientSpec(){
$fs = new Filesystem();
$fs->ensureDirectoryExists(dirname($clientSpec));
$p4user = trim(shell_exec('echo $P4USER')); $spec = fopen($this->getP4ClientSpec(), 'w');
print ("PerforceDriver: writing to client spec: $clientSpec\n\n");
$spec = fopen($clientSpec, 'w');
try { try {
fwrite($spec, "Client: $p4client\n\n"); fwrite($spec, "Client: " . $this->getClient() . "\n\n");
fwrite($spec, "Update: " . date("Y/m/d H:i:s") . "\n\n"); fwrite($spec, "Update: " . date("Y/m/d H:i:s") . "\n\n");
fwrite($spec, "Access: " . date("Y/m/d H:i:s") . "\n" ); fwrite($spec, "Access: " . date("Y/m/d H:i:s") . "\n" );
fwrite($spec, "Owner: $p4user\n\n" ); fwrite($spec, "Owner: " . $this->getUser() . "\n\n" );
fwrite($spec, "Description:\n" ); fwrite($spec, "Description:\n" );
fwrite($spec, " Created by $p4user from composer.\n\n" ); fwrite($spec, " Created by " . $this->getUser() . " from composer.\n\n" );
fwrite($spec, "Root: $targetDir\n\n" ); fwrite($spec, "Root: " .$this->getPath(). "\n\n" );
fwrite($spec, "Options: noallwrite noclobber nocompress unlocked modtime rmdir\n\n" ); fwrite($spec, "Options: noallwrite noclobber nocompress unlocked modtime rmdir\n\n" );
fwrite($spec, "SubmitOptions: revertunchanged\n\n" ); fwrite($spec, "SubmitOptions: revertunchanged\n\n" );
fwrite($spec, "LineEnd: local\n\n" ); fwrite($spec, "LineEnd: local\n\n" );
fwrite($spec, "Stream:\n" ); fwrite($spec, "Stream:\n" );
fwrite($spec, " $stream\n" ); fwrite($spec, " " . $this->getStream()."\n" );
} catch(Exception $e){ } catch(Exception $e){
fclose($spec); fclose($spec);
throw $e; throw $e;
@ -66,5 +103,50 @@ class Perforce {
fclose($spec); fclose($spec);
} }
public function getComposerFilePath($identifier)
{
$composerFilePath = $this->path . "/composer.json" ;
print ("\nPerforceUtility - getComposerPath: $composerFilePath\n\n");
return $composerFilePath;
}
protected function generateP4Command($command) {
$p4Command = "p4 ";
$p4Command = $p4Command . "-u " . $this->getUser() . " ";
$p4Command = $p4Command . "-c " . $this->getClient() . " ";
$p4Command = $p4Command . "-p " . $this->getPort() . " ";
$p4Command = $p4Command . $command;
return $p4Command;
}
public function p4Login(IOInterface $io){
$user = $this->getUser();
$result = trim(shell_exec("p4 login -s"));
$index = strpos($result, $user);
if ($index === false){
$password = trim(shell_exec('echo $P4PASSWD'));
if (strlen($password) <= 0){
$password = $io->ask("Enter password for Perforce user " . $this->getUser() . ": " );
}
$command = "echo $password | p4 login -a ";
shell_exec($command);
}
}
public static function checkServerExists($url)
{
$result = shell_exec("p4 -p $url info -s");
$index = strpos($result, "error");
if ($index === false){
return true;
}
return false;
}
public function getComposerInformation($identifier)
{
$composerFilePath =$this->getComposerFilePath($identifier);
$contents = file_get_contents($composerFilePath);
$composer_info = json_decode($contents, true);
return $composer_info;
}
} }