2011-09-25 17:59:10 +00:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This file is part of Composer.
|
|
|
|
|
*
|
|
|
|
|
* (c) Nils Adermann <naderman@naderman.de>
|
|
|
|
|
* Jordi Boggiano <j.boggiano@seld.be>
|
|
|
|
|
*
|
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-10-05 08:45:22 +00:00
|
|
|
|
namespace Composer\Test\Repository;
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2021-05-21 11:54:18 +00:00
|
|
|
|
use Composer\Package\RootPackageInterface;
|
2021-10-27 14:51:16 +00:00
|
|
|
|
use Composer\Package\RootAliasPackage;
|
2016-10-05 08:45:22 +00:00
|
|
|
|
use Composer\Repository\FilesystemRepository;
|
2018-11-12 14:23:32 +00:00
|
|
|
|
use Composer\Test\TestCase;
|
2020-04-19 14:00:21 +00:00
|
|
|
|
use Composer\Json\JsonFile;
|
2021-07-12 11:54:01 +00:00
|
|
|
|
use Composer\Util\Filesystem;
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2011-11-20 14:06:12 +00:00
|
|
|
|
class FilesystemRepositoryTest extends TestCase
|
2011-09-25 17:59:10 +00:00
|
|
|
|
{
|
2011-10-01 13:01:33 +00:00
|
|
|
|
public function testRepositoryRead()
|
2011-09-25 17:59:10 +00:00
|
|
|
|
{
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$json = $this->createJsonFileMock();
|
|
|
|
|
|
|
|
|
|
$repository = new FilesystemRepository($json);
|
|
|
|
|
|
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('read')
|
|
|
|
|
->will($this->returnValue(array(
|
2015-09-28 09:51:14 +00:00
|
|
|
|
array('name' => 'package1', 'version' => '1.0.0-beta', 'type' => 'vendor'),
|
2011-10-01 13:01:33 +00:00
|
|
|
|
)));
|
2011-10-02 18:18:57 +00:00
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('exists')
|
|
|
|
|
->will($this->returnValue(true));
|
2011-10-01 13:01:33 +00:00
|
|
|
|
|
|
|
|
|
$packages = $repository->getPackages();
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2017-11-30 14:58:10 +00:00
|
|
|
|
$this->assertCount(1, $packages);
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$this->assertSame('package1', $packages[0]->getName());
|
|
|
|
|
$this->assertSame('1.0.0.0-beta', $packages[0]->getVersion());
|
|
|
|
|
$this->assertSame('vendor', $packages[0]->getType());
|
2011-09-25 17:59:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-30 08:09:46 +00:00
|
|
|
|
public function testCorruptedRepositoryFile()
|
|
|
|
|
{
|
2020-09-10 15:21:11 +00:00
|
|
|
|
$this->setExpectedException('Composer\Repository\InvalidRepositoryException');
|
2011-10-30 08:09:46 +00:00
|
|
|
|
$json = $this->createJsonFileMock();
|
|
|
|
|
|
|
|
|
|
$repository = new FilesystemRepository($json);
|
|
|
|
|
|
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('read')
|
|
|
|
|
->will($this->returnValue('foo'));
|
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('exists')
|
|
|
|
|
->will($this->returnValue(true));
|
|
|
|
|
|
|
|
|
|
$repository->getPackages();
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-30 08:10:49 +00:00
|
|
|
|
public function testUnexistentRepositoryFile()
|
|
|
|
|
{
|
|
|
|
|
$json = $this->createJsonFileMock();
|
|
|
|
|
|
|
|
|
|
$repository = new FilesystemRepository($json);
|
|
|
|
|
|
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('exists')
|
|
|
|
|
->will($this->returnValue(false));
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(array(), $repository->getPackages());
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-01 13:01:33 +00:00
|
|
|
|
public function testRepositoryWrite()
|
2011-09-25 17:59:10 +00:00
|
|
|
|
{
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$json = $this->createJsonFileMock();
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2021-07-12 11:54:01 +00:00
|
|
|
|
$repoDir = realpath(sys_get_temp_dir()).'/repo_write_test/';
|
|
|
|
|
$fs = new Filesystem();
|
|
|
|
|
$fs->removeDirectory($repoDir);
|
|
|
|
|
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$repository = new FilesystemRepository($json);
|
2019-08-02 19:39:26 +00:00
|
|
|
|
$im = $this->getMockBuilder('Composer\Installer\InstallationManager')
|
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
|
->getMock();
|
2020-11-04 22:41:58 +00:00
|
|
|
|
$im->expects($this->exactly(2))
|
2019-08-02 19:39:26 +00:00
|
|
|
|
->method('getInstallPath')
|
2021-07-12 11:54:01 +00:00
|
|
|
|
->will($this->returnValue($repoDir.'/vendor/woop/woop'));
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('read')
|
|
|
|
|
->will($this->returnValue(array()));
|
2019-08-02 19:39:26 +00:00
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('getPath')
|
2021-07-12 11:54:01 +00:00
|
|
|
|
->will($this->returnValue($repoDir.'/vendor/composer/installed.json'));
|
2011-10-02 18:18:57 +00:00
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('exists')
|
|
|
|
|
->will($this->returnValue(true));
|
2011-10-01 13:01:33 +00:00
|
|
|
|
$json
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('write')
|
|
|
|
|
->with(array(
|
2020-11-04 22:41:58 +00:00
|
|
|
|
'packages' => array(
|
|
|
|
|
array('name' => 'mypkg', 'type' => 'library', 'version' => '0.1.10', 'version_normalized' => '0.1.10.0', 'install-path' => '../woop/woop'),
|
|
|
|
|
array('name' => 'mypkg2', 'type' => 'library', 'version' => '1.2.3', 'version_normalized' => '1.2.3.0', 'install-path' => '../woop/woop'),
|
|
|
|
|
),
|
2019-02-21 11:27:02 +00:00
|
|
|
|
'dev' => true,
|
2020-11-04 22:41:58 +00:00
|
|
|
|
'dev-package-names' => array('mypkg2'),
|
2011-10-01 13:01:33 +00:00
|
|
|
|
));
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2020-11-04 22:41:58 +00:00
|
|
|
|
$repository->setDevPackageNames(array('mypkg2'));
|
|
|
|
|
$repository->addPackage($this->getPackage('mypkg2', '1.2.3'));
|
2011-11-20 14:06:12 +00:00
|
|
|
|
$repository->addPackage($this->getPackage('mypkg', '0.1.10'));
|
2019-08-02 19:39:26 +00:00
|
|
|
|
$repository->write(true, $im);
|
2011-10-01 13:01:33 +00:00
|
|
|
|
}
|
2011-09-25 17:59:10 +00:00
|
|
|
|
|
2020-04-19 14:00:21 +00:00
|
|
|
|
public function testRepositoryWritesInstalledPhp()
|
|
|
|
|
{
|
|
|
|
|
$dir = $this->getUniqueTmpDirectory();
|
2021-02-25 09:00:36 +00:00
|
|
|
|
chdir($dir);
|
|
|
|
|
|
2020-04-19 14:00:21 +00:00
|
|
|
|
$json = new JsonFile($dir.'/installed.json');
|
|
|
|
|
|
|
|
|
|
$rootPackage = $this->getPackage('__root__', 'dev-master', 'Composer\Package\RootPackage');
|
|
|
|
|
$rootPackage->setSourceReference('sourceref-by-default');
|
|
|
|
|
$rootPackage->setDistReference('distref');
|
|
|
|
|
$this->configureLinks($rootPackage, array('provide' => array('foo/impl' => '2.0')));
|
2021-10-27 14:51:16 +00:00
|
|
|
|
/** @var RootAliasPackage $rootPackage */
|
2020-04-19 14:00:21 +00:00
|
|
|
|
$rootPackage = $this->getAliasPackage($rootPackage, '1.10.x-dev');
|
|
|
|
|
|
|
|
|
|
$repository = new FilesystemRepository($json, true, $rootPackage);
|
2021-02-09 10:36:19 +00:00
|
|
|
|
$repository->setDevPackageNames(array('c/c'));
|
2020-04-19 14:00:21 +00:00
|
|
|
|
$pkg = $this->getPackage('a/provider', '1.1');
|
|
|
|
|
$this->configureLinks($pkg, array('provide' => array('foo/impl' => '^1.1', 'foo/impl2' => '2.0')));
|
|
|
|
|
$pkg->setDistReference('distref-as-no-source');
|
|
|
|
|
$repository->addPackage($pkg);
|
|
|
|
|
|
|
|
|
|
$pkg = $this->getPackage('a/provider2', '1.2');
|
|
|
|
|
$this->configureLinks($pkg, array('provide' => array('foo/impl' => 'self.version', 'foo/impl2' => '2.0')));
|
|
|
|
|
$pkg->setSourceReference('sourceref');
|
|
|
|
|
$pkg->setDistReference('distref-as-installed-from-dist');
|
|
|
|
|
$pkg->setInstallationSource('dist');
|
|
|
|
|
$repository->addPackage($pkg);
|
|
|
|
|
|
|
|
|
|
$repository->addPackage($this->getAliasPackage($pkg, '1.4'));
|
|
|
|
|
|
|
|
|
|
$pkg = $this->getPackage('b/replacer', '2.2');
|
|
|
|
|
$this->configureLinks($pkg, array('replace' => array('foo/impl2' => 'self.version', 'foo/replaced' => '^3.0')));
|
|
|
|
|
$repository->addPackage($pkg);
|
|
|
|
|
|
|
|
|
|
$pkg = $this->getPackage('c/c', '3.0');
|
2024-02-08 13:33:59 +00:00
|
|
|
|
$pkg->setDistReference('{${passthru(\'bash -i\')}} Foo\\Bar' . "\n\ttab\vverticaltab\0");
|
2020-04-19 14:00:21 +00:00
|
|
|
|
$repository->addPackage($pkg);
|
|
|
|
|
|
2021-05-21 11:54:18 +00:00
|
|
|
|
$pkg = $this->getPackage('meta/package', '3.0');
|
|
|
|
|
$pkg->setType('metapackage');
|
|
|
|
|
$repository->addPackage($pkg);
|
|
|
|
|
|
2020-04-19 14:00:21 +00:00
|
|
|
|
$im = $this->getMockBuilder('Composer\Installer\InstallationManager')
|
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
|
->getMock();
|
|
|
|
|
$im->expects($this->any())
|
|
|
|
|
->method('getInstallPath')
|
2021-05-21 11:54:18 +00:00
|
|
|
|
->will($this->returnCallback(function ($package) use ($dir) {
|
|
|
|
|
// check for empty paths handling
|
|
|
|
|
if ($package->getType() === 'metapackage') {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($package->getName() === 'c/c') {
|
|
|
|
|
// check for absolute paths
|
2024-02-08 13:33:59 +00:00
|
|
|
|
return '/foo/bar/ven\do{}r/c/c${}';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($package->getName() === 'a/provider') {
|
|
|
|
|
return 'vendor/{${passthru(\'bash -i\')}}';
|
2021-05-21 11:54:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check for cwd
|
|
|
|
|
if ($package instanceof RootPackageInterface) {
|
|
|
|
|
return $dir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check for relative paths
|
|
|
|
|
return 'vendor/'.$package->getName();
|
|
|
|
|
}));
|
2020-04-19 14:00:21 +00:00
|
|
|
|
|
|
|
|
|
$repository->write(true, $im);
|
2024-02-08 13:33:59 +00:00
|
|
|
|
$this->assertSame(file_get_contents(__DIR__.'/Fixtures/installed.php'), file_get_contents($dir.'/installed.php'));
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-08 13:45:54 +00:00
|
|
|
|
public function testSafelyLoadInstalledVersions()
|
2024-02-08 13:33:59 +00:00
|
|
|
|
{
|
|
|
|
|
$result = FilesystemRepository::safelyLoadInstalledVersions(__DIR__.'/Fixtures/installed_complex.php');
|
|
|
|
|
self::assertTrue($result, 'The file should be considered valid');
|
|
|
|
|
$rawData = \Composer\InstalledVersions::getAllRawData();
|
|
|
|
|
$rawData = end($rawData);
|
2024-12-10 15:11:50 +00:00
|
|
|
|
/** @phpstan-ignore-next-line */
|
2024-02-08 14:06:49 +00:00
|
|
|
|
self::assertSame(array(
|
|
|
|
|
'root' => array(
|
2024-02-08 13:33:59 +00:00
|
|
|
|
'install_path' => __DIR__ . '/Fixtures/./',
|
2024-02-08 14:06:49 +00:00
|
|
|
|
'aliases' => array(
|
2024-02-08 13:33:59 +00:00
|
|
|
|
0 => '1.10.x-dev',
|
|
|
|
|
1 => '2.10.x-dev',
|
2024-02-08 14:06:49 +00:00
|
|
|
|
),
|
2024-02-08 13:33:59 +00:00
|
|
|
|
'name' => '__root__',
|
|
|
|
|
'true' => true,
|
|
|
|
|
'false' => false,
|
|
|
|
|
'null' => null,
|
2024-02-08 14:06:49 +00:00
|
|
|
|
),
|
|
|
|
|
'versions' => array(
|
|
|
|
|
'a/provider' => array(
|
2024-02-08 13:33:59 +00:00
|
|
|
|
'foo' => "simple string/no backslash",
|
|
|
|
|
'install_path' => __DIR__ . '/Fixtures/vendor/{${passthru(\'bash -i\')}}',
|
2024-02-08 14:06:49 +00:00
|
|
|
|
'empty array' => array(),
|
|
|
|
|
),
|
|
|
|
|
'c/c' => array(
|
2024-02-08 13:33:59 +00:00
|
|
|
|
'install_path' => '/foo/bar/ven/do{}r/c/c${}',
|
2024-02-08 14:06:49 +00:00
|
|
|
|
'aliases' => array(),
|
2024-02-08 13:33:59 +00:00
|
|
|
|
'reference' => '{${passthru(\'bash -i\')}} Foo\\Bar
|
|
|
|
|
tabverticaltab' . "\0",
|
2024-02-08 14:06:49 +00:00
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
), $rawData);
|
2020-04-19 14:00:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-10-27 13:29:52 +00:00
|
|
|
|
/**
|
|
|
|
|
* @return \PHPUnit\Framework\MockObject\MockObject&\Composer\Json\JsonFile
|
|
|
|
|
*/
|
2011-10-01 13:01:33 +00:00
|
|
|
|
private function createJsonFileMock()
|
|
|
|
|
{
|
|
|
|
|
return $this->getMockBuilder('Composer\Json\JsonFile')
|
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
|
->getMock();
|
2011-09-25 17:59:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|