From 321016cce5c6faf88a47e915bd0cc239a6156c0a Mon Sep 17 00:00:00 2001 From: Volodymy Panivko Date: Thu, 27 Jan 2022 15:39:40 +0200 Subject: [PATCH] Add config option for update reference in path repository --- doc/05-repositories.md | 19 ++++++++ src/Composer/Repository/PathRepository.php | 22 +++++++-- .../Test/Repository/PathRepositoryTest.php | 46 +++++++++++++++++++ 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/doc/05-repositories.md b/doc/05-repositories.md index 7ab8b9da76d5..88fa95a7f99f 100644 --- a/doc/05-repositories.md +++ b/doc/05-repositories.md @@ -755,6 +755,25 @@ variables are parsed in both Windows and Linux/Mac notations. For example > **Note:** Repository paths can also contain wildcards like `*` and `?`. > For details, see the [PHP glob function](https://php.net/glob). +You can configure the behavior of reference building for a package. Field reference showing when something changed in package. +There are the following options: +- null - reference will be always null +- config - reference is building basing on hash of composer.json and repo config +- auto (used by default) - reference is building basing on hash of composer.json and repo config, but if the package folder contain git repository, then reference will be equal to the last commit hash in this folder +```json +{ + "repositories": [ + { + "type": "path", + "url": "../../packages/my-package", + "options": { + "reference": "auto" + } + } + ] +} +``` + ## Disabling Packagist.org You can disable the default Packagist.org repository by adding this to your diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index 3cb879c5c52c..5ad28c84ed00 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -56,6 +56,13 @@ * "symlink": false * } * }, + * { + * "type": "path", + * "url": "../../relative/path/to/package/", + * "options": { + * "reference": "none" + * } + * }, * ] * @endcode * @@ -81,7 +88,7 @@ class PathRepository extends ArrayRepository implements ConfigurableRepositoryIn /** * @var mixed[] - * @phpstan-var array{url: string, options?: array{symlink?: bool, relative?: bool, versions?: array}} + * @phpstan-var array{url: string, options?: array{symlink?: bool, reference?: string, relative?: bool, versions?: array}} */ private $repoConfig; @@ -91,14 +98,14 @@ class PathRepository extends ArrayRepository implements ConfigurableRepositoryIn private $process; /** - * @var array{symlink?: bool, relative?: bool, versions?: array} + * @var array{symlink?: bool, reference?: string, relative: bool, versions?: array} */ private $options; /** * Initializes path repository. * - * @param array{url?: string, options?: array{symlink?: bool, relative?: bool, versions?: array}} $repoConfig + * @param array{url?: string, options?: array{symlink?: bool, reference?: string, relative?: bool, versions?: array}} $repoConfig * @param IOInterface $io * @param Config $config */ @@ -171,8 +178,13 @@ protected function initialize() $package['dist'] = array( 'type' => 'path', 'url' => $url, - 'reference' => sha1($json . serialize($this->options)), ); + $reference = $this->options['reference'] ?? 'auto'; + if ('none' === $reference) { + $package['dist']['reference'] = null; + } elseif ('config' === $reference || 'auto' === $reference) { + $package['dist']['reference'] = sha1($json . serialize($this->options)); + } $package['transport-options'] = $this->options; unset($package['transport-options']['versions']); @@ -193,7 +205,7 @@ protected function initialize() } $output = ''; - if (is_dir($path . DIRECTORY_SEPARATOR . '.git') && 0 === $this->process->execute('git log -n1 --pretty=%H'.GitUtil::getNoShowSignatureFlag($this->process), $output, $path)) { + if ('auto' === $reference && is_dir($path . DIRECTORY_SEPARATOR . '.git') && 0 === $this->process->execute('git log -n1 --pretty=%H'.GitUtil::getNoShowSignatureFlag($this->process), $output, $path)) { $package['dist']['reference'] = trim($output); } diff --git a/tests/Composer/Test/Repository/PathRepositoryTest.php b/tests/Composer/Test/Repository/PathRepositoryTest.php index cb1aa0e3f205..bff6fd6b24cc 100644 --- a/tests/Composer/Test/Repository/PathRepositoryTest.php +++ b/tests/Composer/Test/Repository/PathRepositoryTest.php @@ -154,4 +154,50 @@ public function testUrlRemainsRelative() $relativeUrl = str_replace(DIRECTORY_SEPARATOR, '/', $relativeUrl); $this->assertSame($relativeUrl, $package->getDistUrl()); } + + public function testReferenceNone() + { + $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') + ->getMock(); + + $config = new \Composer\Config(); + + $options = array( + 'reference' => 'none', + ); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); + $repository = new PathRepository(array('url' => $repositoryUrl, 'options' => $options), $ioInterface, $config); + $packages = $repository->getPackages(); + + $this->assertGreaterThanOrEqual(2, $repository->count()); + + foreach ($packages as $package) { + $this->assertEquals($package->getDistReference(), null); + } + } + + public function testReferenceConfig() + { + $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') + ->getMock(); + + $config = new \Composer\Config(); + + $options = array( + 'reference' => 'config', + 'relative' => true, + ); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); + $repository = new PathRepository(array('url' => $repositoryUrl, 'options' => $options), $ioInterface, $config); + $packages = $repository->getPackages(); + + $this->assertGreaterThanOrEqual(2, $repository->count()); + + foreach ($packages as $package) { + $this->assertEquals( + $package->getDistReference(), + sha1(file_get_contents($package->getDistUrl() . '/composer.json') . serialize($options)) + ); + } + } }