Browse Source

Fixed issue with downloader assuming repository would be VcsRepository

matt-whittom 11 years ago
parent
commit
f737e49aae

+ 10 - 3
src/Composer/Downloader/PerforceDownloader.php

@@ -37,7 +37,7 @@ class PerforceDownloader extends VcsDownloader
         $label = $package->getPrettyVersion();
 
         $this->io->write("    Cloning ".$ref);
-        $this->initPerforce($package, $path);
+        $this->initPerforce($package, $path, $ref);
         $this->perforce->setStream($ref);
         $this->perforce->queryP4User($this->io);
         $this->perforce->writeP4ClientSpec();
@@ -46,15 +46,22 @@ class PerforceDownloader extends VcsDownloader
         $this->perforce->cleanupClientSpec();
     }
 
-    private function initPerforce($package, $path){
+    private function initPerforce($package, $path, $ref){
         if ($this->perforceInjected){
             return;
         }
         $repository = $package->getRepository();
-        $repoConfig = $repository->getRepoConfig();
+        $repoConfig = null;
+        if ($repository instanceof VcsRepository){
+            $repoConfig = $this->getRepoConfig($repository);
+        }
         $this->perforce = Perforce::createPerforce($repoConfig, $package->getSourceUrl(), $path);
     }
 
+    private function getRepoConfig(VcsRepository $repository){
+        return $repository->getRepoConfig();
+    }
+
     /**
      * {@inheritDoc}
      */

+ 5 - 4
src/Composer/Repository/Vcs/PerforceDriver.php

@@ -42,7 +42,7 @@ class PerforceDriver extends VcsDriver {
             $this->branch = $this->repoConfig['branch'];
         }
 
-        $this->initPerforce();
+        $this->initPerforce($this->repoConfig);
         $this->perforce->p4Login($this->io);
         $this->perforce->checkStream($this->depot);
 
@@ -52,14 +52,14 @@ class PerforceDriver extends VcsDriver {
         return TRUE;
     }
 
-    private function initPerforce()
+    private function initPerforce($repoConfig)
     {
         if (isset($this->perforce)) {
             return;
         }
 
         $repoDir = $this->config->get('cache-vcs-dir') . "/$this->depot";
-        $this->perforce = Perforce::createPerforce($this->repoConfig, $this->getUrl(), $repoDir, $this->process);
+        $this->perforce = Perforce::createPerforce($repoConfig, $this->getUrl(), $repoDir, $this->process);
     }
 
     /**
@@ -122,7 +122,8 @@ class PerforceDriver extends VcsDriver {
         $source = array(
             'type'      => 'perforce',
             'url'       => $this->repoConfig['url'],
-            'reference' => $identifier
+            'reference' => $identifier,
+            'p4user' => $this->perforce->getUser()
         );
 
         return $source;

+ 33 - 12
src/Composer/Util/Perforce.php

@@ -42,30 +42,34 @@ class Perforce {
             $process = new ProcessExecutor;
         }
         $isWindows = defined('PHP_WINDOWS_VERSION_BUILD');
-        if (isset($repoConfig['unique_perforce_client_name'])){
-            $unique_perforce_client_name = $repoConfig['unique_perforce_client_name'];
-        } else {
-            $unique_perforce_client_name = gethostname() . "_" . time();
-            $repoConfig['unique_perforce_client_name'] = $unique_perforce_client_name;
-        }
 
-        $perforce = new Perforce($repoConfig, $port, $path, $process, $isWindows, $unique_perforce_client_name);
+        $perforce = new Perforce($repoConfig, $port, $path, $process, $isWindows);
         return $perforce;
     }
 
-    public function __construct($repoConfig, $port, $path, ProcessExecutor $process, $isWindows, $unique_perforce_client_name) {
+    public function __construct($repoConfig, $port, $path, ProcessExecutor $process, $isWindows) {
         $this->windowsFlag = $isWindows;
-        $this->unique_perforce_client_name = $unique_perforce_client_name;
         $this->p4Port = $port;
         $this->path = $path;
         $fs = new Filesystem();
         $fs->ensureDirectoryExists($path);
         $this->process = $process;
+        $this->initialize($repoConfig);
+    }
+
+    public function initialize($repoConfig){
+        $this->unique_perforce_client_name = $this->generateUniquePerforceClientName();
+        if (!isset ($repoConfig)){
+            return;
+        }
+        if (isset($repoConfig['unique_perforce_client_name'])){
+            $this->unique_perforce_client_name = $repoConfig['unique_perforce_client_name'];
+        }
 
-        if (isset($repoConfig['depot'])) {
+        if (isset($repoConfig['depot'])){
             $this->p4Depot = $repoConfig['depot'];
         }
-        if (isset($repoConfig['branch'])) {
+        if (isset($repoConfig['branch'])){
             $this->p4Branch = $repoConfig['branch'];
         }
         if (isset($repoConfig['p4user'])) {
@@ -79,6 +83,19 @@ class Perforce {
         }
     }
 
+    public function initializeDepotAndBranch($depot, $branch){
+        if (isset($depot)) {
+            $this->p4Depot = $depot;
+        }
+        if (isset($branch)) {
+            $this->p4Branch = $branch;
+        }
+    }
+
+    public function generateUniquePerforceClientName(){
+            return gethostname() . "_" . time();
+    }
+
     public function cleanupClientSpec(){
         $client = $this->getClient();
         $command = "p4 client -d $client";
@@ -114,7 +131,11 @@ class Perforce {
 
     public function setStream($stream) {
         $this->p4Stream = $stream;
-        $this->p4DepotType = "stream";
+        $index = strrpos($stream, "/");
+        //Stream format is //depot/stream, while non-streaming depot is //depot
+        if ($index > 2){
+            $this->p4DepotType = "stream";
+        }
     }
 
     public function isStream() {

+ 2 - 2
tests/Composer/Test/Util/PerforceTest.php

@@ -28,8 +28,8 @@ class PerforceTest extends \PHPUnit_Framework_TestCase {
 
     public function setUp() {
         $this->processExecutor = $this->getMock('Composer\Util\ProcessExecutor');
-        $repoConfig = array("depot"=>"depot", "branch"=>"branch", "p4user"=>"user");
-        $this->perforce = new Perforce($repoConfig, "port", "path", $this->processExecutor, true, "TEST");
+        $repoConfig = array("depot"=>"depot", "branch"=>"branch", "p4user"=>"user", "unique_perforce_client_name" => "TEST");
+        $this->perforce = new Perforce($repoConfig, "port", "path", $this->processExecutor, true);
     }
 
     public function testGetClientWithoutStream() {