Skip to content

Commit

Permalink
Make sure "roundcube/roundcubemail" install path is always available
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed May 3, 2024
1 parent 003a69c commit de87a3c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
],
"require": {
"php": ">=7.3 <8.4",
"composer-plugin-api": "^1.0 || ^2.0",
"composer-plugin-api": "^2.1",
"roundcube/roundcubemail": "*"
},
"require-dev": {
"composer/composer": "^2.0",
"composer/composer": "^2.1",
"ergebnis/composer-normalize": "^2.13",
"friendsofphp/php-cs-fixer": "^3.0",
"phpstan/extension-installer": "^1.1",
Expand Down
20 changes: 16 additions & 4 deletions src/ExtensionInstaller.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Roundcube\Composer;

use Composer\Installer\InstallationManager;
use Composer\Installer\LibraryInstaller;
use Composer\Package\PackageInterface;
use Composer\Package\Version\VersionParser;
Expand Down Expand Up @@ -43,15 +44,26 @@ protected function setRoundcubemailInstallPath(InstalledRepositoryInterface $ins

protected function getRoundcubemailInstallPath(): string
{
// install path is not set at composer download phase
// never assume any path, but for this known composer behaviour get it from backtrace instead
if ($this->roundcubemailInstallPath === null) {
$backtrace = debug_backtrace();
foreach ($backtrace as $frame) {
// relies on https://github.com/composer/composer/blob/2.7.4/src/Composer/Installer/InstallationManager.php#L243
if (($frame['object'] ?? null) instanceof InstallationManager
&& $frame['function'] === 'downloadAndExecuteBatch'
) {
$this->setRoundcubemailInstallPath($frame['args'][0]);
}
}
}

return $this->roundcubemailInstallPath;
}

public function getInstallPath(PackageInterface $package)
{
if (
!$this->supports($package->getType())
|| $this->roundcubemailInstallPath === null // install path is not known at download phase
) {
if (!$this->supports($package->getType())) {
return parent::getInstallPath($package);
}

Expand Down

0 comments on commit de87a3c

Please sign in to comment.