Browse Source

Allow wildcards in repository path names.

Dennis Birkholz 9 years ago
parent
commit
323537ad0f

+ 28 - 25
src/Composer/Repository/PathRepository.php

@@ -97,36 +97,39 @@ class PathRepository extends ArrayRepository
     {
         parent::initialize();
 
-        $path = $this->getPath();
-        $composerFilePath = $path.'composer.json';
-        if (!file_exists($composerFilePath)) {
-            throw new \RuntimeException(sprintf('No `composer.json` file found in path repository "%s"', $path));
+        foreach ($this->getPaths() as $path) {
+            $composerFilePath = $path.'composer.json';
+            if (!file_exists($composerFilePath)) {
+                continue;
+            }
+
+            $json = file_get_contents($composerFilePath);
+            $package = JsonFile::parseJson($json, $composerFilePath);
+            $package['dist'] = array(
+                'type' => 'path',
+                'url' => $this->url,
+                'reference' => '',
+            );
+
+            if (!isset($package['version'])) {
+                $package['version'] = $this->versionGuesser->guessVersion($package, $path) ?: 'dev-master';
+            }
+            if (is_dir($path.'/.git') && 0 === $this->process->execute('git log -n1 --pretty=%H', $output, $path)) {
+                $package['dist']['reference'] = trim($output);
+            }
+
+            $package = $this->loader->load($package);
+            $this->addPackage($package);
         }
-
-        $json = file_get_contents($composerFilePath);
-        $package = JsonFile::parseJson($json, $composerFilePath);
-        $package['dist'] = array(
-            'type' => 'path',
-            'url' => $this->url,
-            'reference' => '',
-        );
-
-        if (!isset($package['version'])) {
-            $package['version'] = $this->versionGuesser->guessVersion($package, $path) ?: 'dev-master';
-        }
-        if (is_dir($path.'/.git') && 0 === $this->process->execute('git log -n1 --pretty=%H', $output, $path)) {
-            $package['dist']['reference'] = trim($output);
-        }
-
-        $package = $this->loader->load($package);
-        $this->addPackage($package);
     }
 
     /**
-     * @return string
+     * Get a list of all absolute path names matching the supplied urls
+     *
+     * @return string[]
      */
-    private function getPath()
+    private function getPaths()
     {
-        return realpath(rtrim($this->url, '/')) . '/';
+        return glob($this->url, GLOB_MARK|GLOB_ONLYDIR);
     }
 }

+ 1 - 1
tests/Composer/Test/Repository/Fixtures/path/with-version/composer.json

@@ -1,4 +1,4 @@
 {
-  "name": "test/path",
+  "name": "test/path-versioned",
   "version": "0.0.2"
 }

+ 1 - 1
tests/Composer/Test/Repository/Fixtures/path/without-version/composer.json

@@ -1,3 +1,3 @@
 {
-  "name": "test/path"
+  "name": "test/path-unversioned"
 }

+ 24 - 2
tests/Composer/Test/Repository/PathRepositoryTest.php

@@ -35,7 +35,7 @@ class PathRepositoryTest extends TestCase
         $repository->getPackages();
 
         $this->assertEquals(1, $repository->count());
-        $this->assertTrue($repository->hasPackage($this->getPackage('test/path', '0.0.2')));
+        $this->assertTrue($repository->hasPackage($this->getPackage('test/path-versioned', '0.0.2')));
     }
 
     public function testLoadPackageFromFileSystemWithoutVersion()
@@ -54,9 +54,31 @@ class PathRepositoryTest extends TestCase
         $this->assertEquals(1, $repository->count());
 
         $package = $packages[0];
-        $this->assertEquals('test/path', $package->getName());
+        $this->assertEquals('test/path-unversioned', $package->getName());
 
         $packageVersion = $package->getVersion();
         $this->assertTrue(!empty($packageVersion));
     }
+
+    public function testLoadPackageFromFileSystemWithWildcard()
+    {
+        $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface')
+            ->getMock();
+
+        $config = new \Composer\Config();
+        $loader = new ArrayLoader(new VersionParser());
+        $versionGuesser = null;
+
+        $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*'));
+        $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config, $loader);
+        $packages = $repository->getPackages();
+
+        $this->assertEquals(2, $repository->count());
+
+        $package = $packages[0];
+        $this->assertEquals('test/path-versioned', $package->getName());
+
+        $package = $packages[1];
+        $this->assertEquals('test/path-unversioned', $package->getName());
+    }
 }