Skip to content

MultiConstraint loop #177

@oyeaussie

Description

@oyeaussie

My composer.json:

{
    "require":
    {
        "composer/composer": "^2.7",
        "cweagans/composer-patches": "^1.7",
        "league/oauth2-server": "^8.5",
        "cboden/ratchet": "^0.4.4",
        "react/zmq": "^0.4.0",
        "react/socket": "^1.15",
        "league/flysystem": "^3.24",
        "phpmailer/phpmailer": "^6.9",
        "guzzlehttp/guzzle": "^7.8",
        "thecodingmachine/safe": "^2.5",
        "symfony/translation-contracts": "^3.4",
        "symfony/translation": "^7.0",
        "symfony/polyfill-php80": "^1.29",
        "symfony/polyfill-mbstring": "^1.29",
        "symfony/deprecation-contracts": "^3.4",
        "spomky-labs/otphp": "^11.2",
        "ralouphie/getallheaders": "^3.0",
        "psr/http-message": "^2.0",
        "psr/http-client": "^1.0",
        "picqer/php-barcode-generator": "^2.4",
        "paragonie/constant_time_encoding": "^2.6",
        "nesbot/carbon": "^3.0",
        "league/mime-type-detection": "^1.15",
        "khanamiryan/qrcode-detector-decoder": "^2.0",
        "guzzlehttp/psr7": "^2.6",
        "guzzlehttp/promises": "^2.0",
        "endroid/qr-code": "^5.0",
        "dasprid/enum": "^1.0",
        "beberlei/assert": "^3.3",
        "bacon/bacon-qr-code": "^2.0",
        "peppeocchi/php-cron-scheduler": "^4.0",
        "php-imap/php-imap": "^5.0",
        "league/csv": "^9.15",
        "paquettg/php-html-parser": "^2.2",
        "ifsnop/mysqldump-php": "^2.12",
        "spatie/flysystem-dropbox": "^3.0",
        "bjeavons/zxcvbn-php": "^1.3",
        "bluelibraries/dns": "^1.1",
        "league/oauth2-github": "^3.1",
        "league/oauth2-client": "^2.7",
        "z4kn4fein/php-semver": "^3.0",
        "opis/json-schema": "^2.3",
        "league/flysystem-sftp-v3": "^3.23",
        "lasserafn/php-initial-avatar-generator": "^4.3",
        "wp-cli/php-cli-tools": "^0.11.22",
        "react/event-loop": "1.5.0",
        "mattiasgeniar/php-percentages": "^1.3",
        "spatie/server-side-rendering": "^0.3.2",
        "xobotyi/rsync": "^1.0",
        "mistic100/randomcolor": "^1.1",
        "sop/asn1": "^4.1"
    },
    "config":
    {
        "allow-plugins":
        {
            "cweagans/composer-patches": true
        }
    },
    "extra":
    {
        "patches":
        {
            "react/socket":
            {
                "phpv8.3 support": "patches/react_socket_connection.patch"
            },
            "cboden/ratchet":
            {
                "phpv8.3 support": "patches/cboden_ratchet_ioconnection.patch"
            },
            "league/oauth2-server":
            {
                "extract client_id": "patches/league_oauth2_server_bearertokenvalidator.patch"
            }
        }
    }
}

Output of composer diagnose:

root@test:/var/www/html/sp/external# ./composer diagnose
Checking pubkeys: 
Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952
OK
Checking Composer version: OK
Composer version: 2.10.1
Checking Composer and its dependencies for vulnerabilities: OK
PHP version: 8.3.30
PHP binary path: /usr/bin/php8.3
OpenSSL version: OpenSSL 3.0.2 15 Mar 2022
curl version: 7.81.0 libz 1.2.11 brotli 1.0.9 zstd supported ssl OpenSSL/3.0.2 HTTP 1.0, 1.1, 2
zip: extension present, unzip present, 7-Zip not available
Active plugins: cweagans/composer-patches
Checking composer.json: WARNING
No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.
require.react/event-loop : exact version constraints (1.5.0) should be avoided if the package follows semantic versioning
Checking platform settings: OK
Checking git settings: OK git version 2.34.1
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
root@test:/var/www/html/sp/external# 

When I run this command:

root@test:/var/www/html/sp/external# export COMPOSER_HOME=/var/www/html/sp/external
root@test:/var/www/html/sp/external# export COMPOSER=/var/www/html/sp/external/sop_asn1_composer.json 
root@test:/var/www/html/sp/external# 
root@test:/var/www/html/sp/external# echo $COMPOSER
/var/www/html/sp/external/sop_asn1_composer.json
root@test:/var/www/html/sp/external# 
root@test:/var/www/html/sp/external# echo $COMPOSER_HOME
/var/www/html/sp/external
root@test:/var/www/html/sp/external# 
root@test:/var/www/html/sp/external# ./composer install --dry-run -d /var/www/html/sp/system/Base/../../external/

I get the following output:

No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 110 installs, 0 updates, 0 removals
  - Locking bacon/bacon-qr-code (2.0.8)
  - Locking beberlei/assert (v3.3.4)
  - Locking bjeavons/zxcvbn-php (1.4.2)
  - Locking bluelibraries/dns (1.1.1)
  - Locking carbonphp/carbon-doctrine-types (3.2.0)
  - Locking cboden/ratchet (v0.4.4)
  - Locking composer/ca-bundle (1.5.12)
  - Locking composer/class-map-generator (1.7.3)
  - Locking composer/composer (2.10.1)
  - Locking composer/metadata-minifier (1.0.0)
  - Locking composer/pcre (3.4.0)
  - Locking composer/semver (3.4.4)
  - Locking composer/spdx-licenses (1.6.0)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking cweagans/composer-patches (1.7.3)
  - Locking dasprid/enum (1.0.7)
  - Locking defuse/php-encryption (v2.4.0)
  - Locking dragonmantank/cron-expression (v3.6.0)
  - Locking endroid/qr-code (5.0.7)
  - Locking evenement/evenement (v3.0.2)
  - Locking graham-campbell/guzzle-factory (v7.0.3)
  - Locking guzzlehttp/guzzle (7.11.1)
  - Locking guzzlehttp/promises (2.5.0)
  - Locking guzzlehttp/psr7 (2.11.0)
  - Locking ifsnop/mysqldump-php (v2.12)
  - Locking intervention/image (2.7.2)
  - Locking justinrainbow/json-schema (6.9.0)
  - Locking khanamiryan/qrcode-detector-decoder (2.0.3)
  - Locking lasserafn/php-initial-avatar-generator (4.5)
  - Locking lasserafn/php-initials (3.1)
  - Locking lasserafn/php-string-script-language (0.4)
  - Locking lcobucci/clock (3.5.0)
  - Locking lcobucci/jwt (5.6.0)
  - Locking league/csv (9.28.0)
  - Locking league/event (2.3.0)
  - Locking league/flysystem (3.34.0)
  - Locking league/flysystem-local (3.31.0)
  - Locking league/flysystem-sftp-v3 (3.33.0)
  - Locking league/mime-type-detection (1.16.0)
  - Locking league/oauth2-client (2.9.0)
  - Locking league/oauth2-github (3.1.1)
  - Locking league/oauth2-server (8.5.5)
  - Locking league/uri (7.8.1)
  - Locking league/uri-interfaces (7.8.1)
  - Locking marc-mabe/php-enum (v4.7.2)
  - Locking mattiasgeniar/php-percentages (1.3.0)
  - Locking meyfa/php-svg (v0.9.1)
  - Locking mistic100/randomcolor (1.1.0)
  - Locking nesbot/carbon (3.11.4)
  - Locking opis/json-schema (2.6.0)
  - Locking opis/string (2.1.0)
  - Locking opis/uri (1.1.0)
  - Locking overtrue/pinyin (4.1.0)
  - Locking paquettg/php-html-parser (2.2.1)
  - Locking paquettg/string-encode (1.0.1)
  - Locking paragonie/constant_time_encoding (v2.8.2)
  - Locking paragonie/random_compat (v9.99.100)
  - Locking peppeocchi/php-cron-scheduler (v4.0)
  - Locking php-imap/php-imap (5.1.0)
  - Locking phpmailer/phpmailer (v6.12.0)
  - Locking phpseclib/phpseclib (3.0.53)
  - Locking picqer/php-barcode-generator (v2.4.2)
  - Locking psr/clock (1.0.0)
  - Locking psr/container (2.0.2)
  - Locking psr/http-client (1.0.3)
  - Locking psr/http-factory (1.1.0)
  - Locking psr/http-message (2.0)
  - Locking psr/log (3.0.2)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking ratchet/rfc6455 (v0.3.1)
  - Locking react/cache (v1.2.0)
  - Locking react/dns (v1.14.0)
  - Locking react/event-loop (v1.5.0)
  - Locking react/promise (v3.3.0)
  - Locking react/socket (v1.17.0)
  - Locking react/stream (v1.4.0)
  - Locking react/zmq (v0.4.0)
  - Locking seld/jsonlint (1.12.0)
  - Locking seld/phar-utils (1.2.1)
  - Locking seld/signal-handler (2.0.2)
  - Locking sop/asn1 (4.1.2)
  - Locking spatie/dropbox-api (1.24.0)
  - Locking spatie/flysystem-dropbox (3.1.0)
  - Locking spatie/server-side-rendering (0.3.2)
  - Locking spomky-labs/otphp (11.5.0)
  - Locking symfony/clock (v7.4.8)
  - Locking symfony/console (v7.4.13)
  - Locking symfony/deprecation-contracts (v3.7.0)
  - Locking symfony/filesystem (v7.4.11)
  - Locking symfony/finder (v7.4.8)
  - Locking symfony/http-foundation (v6.4.41)
  - Locking symfony/polyfill-ctype (v1.37.0)
  - Locking symfony/polyfill-intl-grapheme (v1.38.1)
  - Locking symfony/polyfill-intl-normalizer (v1.38.0)
  - Locking symfony/polyfill-mbstring (v1.38.2)
  - Locking symfony/polyfill-php73 (v1.37.0)
  - Locking symfony/polyfill-php80 (v1.37.0)
  - Locking symfony/polyfill-php81 (v1.38.1)
  - Locking symfony/polyfill-php83 (v1.38.2)
  - Locking symfony/polyfill-php84 (v1.38.1)
  - Locking symfony/process (v6.4.41)
  - Locking symfony/routing (v6.4.41)
  - Locking symfony/service-contracts (v3.7.0)
  - Locking symfony/string (v7.4.13)
  - Locking symfony/translation (v7.4.10)
  - Locking symfony/translation-contracts (v3.7.0)
  - Locking thecodingmachine/safe (v2.5.0)
  - Locking wp-cli/php-cli-tools (v0.11.22)
  - Locking xobotyi/rsync (v1.0.3)
  - Locking z4kn4fein/php-semver (v3.0.0)
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing sop/asn1 (4.1.2)
21 package suggestions were added by new dependencies, use `composer suggest` to see details.
61 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
root@test:/var/www/html/sp/external#

And I expected this to happen:
The above command works fine via CLI. I am installing packages via php script.

try {
    putenv('COMPOSER_HOME=' . '/var/www/html/sp/external');
    if ($taskName !== 'uninstall' && $taskName !== 'remove') {
        putenv('COMPOSER=' . '/var/www/html/sp/external/sop_asn1_composer.json');
    }

    $stream = fopen('/var/www/html/sp/external/sop_asn1.install', 'w');

    $input = new \Symfony\Component\Console\Input\StringInput('install --dry-run -d /var/www/html/sp/external');

    $output = new \Symfony\Component\Console\Output\StreamOutput($stream);

    $application = new \Composer\Console\Application();
    $application->setAutoExit(false); // prevent `$application->run` method from exiting the script

    $app = $application->run($input, $output);

    $installLogs = $this->localContent->read('/var/www/html/sp/external/sop_asn1.install');
} catch (\throwable | UnableToReadFile | UnableToWriteFile $e) {
    return $this->queueHasErrors($e->getMessage(), $preCheckQueueLogs, $precheck);
}

if ($app !== 0) {
    return $this->queueHasErrors('Precheck for composer package failed : sop/asn1<br>' . $installLogs, $preCheckQueueLogs);
}

Which results in a loop.

Precheck for composer package failed : sop/asn1
Composer is operating slower than normal because you have Xdebug enabled. See https://getcomposer.org/xdebug
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information

In Constraint.php line 316:
                                                                               
  [Error]                                                                      
  Xdebug has detected a possible infinite loop, and aborted your script with   
  a stack depth of '512' frames                                                
                                                                               

Exception trace:
  at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/Constraint.php:316
 str_replace() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/Constraint.php:316
 Composer\Semver\Constraint\Constraint->matchSpecific() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/Constraint.php:137
 Composer\Semver\Constraint\Constraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:137
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:121
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:133
.
.
.
.
.
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:121
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:133
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:121
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/semver/src/Constraint/MultiConstraint.php:121
 Composer\Semver\Constraint\MultiConstraint->matches() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php:720
 Composer\Repository\ComposerRepository->Composer\Repository\{closure}() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php:749
 Composer\Repository\ComposerRepository::Composer\Repository\{closure}() at n/a:n/a
 array_map() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php:747
 Composer\Repository\ComposerRepository::Composer\Repository\{closure}() at /var/www/html/sp/external/vendor/react/promise/src/Internal/FulfilledPromise.php:47
 React\Promise\Internal\FulfilledPromise->then() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php:738
 Composer\Repository\ComposerRepository->getSecurityAdvisories() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/RepositorySet.php:286
 Composer\Repository\RepositorySet->getSecurityAdvisoriesForConstraints() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/RepositorySet.php:267
 Composer\Repository\RepositorySet->getMatchingSecurityAdvisories() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/DependencyResolver/SecurityAdvisoryPoolFilter.php:76
 Composer\DependencyResolver\SecurityAdvisoryPoolFilter->filter() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php:866
 Composer\DependencyResolver\PoolBuilder->runSecurityAdvisoryFilter() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php:359
 Composer\DependencyResolver\PoolBuilder->buildPool() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Repository/RepositorySet.php:348
 Composer\Repository\RepositorySet->createPool() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Installer.php:530
 Composer\Installer->doUpdate() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Installer.php:321
 Composer\Installer->run() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Command/InstallCommand.php:152
 Composer\Command\InstallCommand->execute() at /var/www/html/sp/external/vendor/symfony/console/Command/Command.php:341
 Symfony\Component\Console\Command\Command->run() at /var/www/html/sp/external/vendor/symfony/console/Application.php:1094
 Symfony\Component\Console\Application->doRunCommand() at /var/www/html/sp/external/vendor/symfony/console/Application.php:356
 Symfony\Component\Console\Application->doRun() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Console/Application.php:447
 Composer\Console\Application->doRun() at /var/www/html/sp/external/vendor/symfony/console/Application.php:195
 Symfony\Component\Console\Application->run() at /var/www/html/sp/external/vendor/composer/composer/src/Composer/Console/Application.php:141
 Composer\Console\Application->run() at /var/www/html/sp/system/Base/Providers/ModulesServiceProvider/Installer.php:620
 System\Base\Providers\ModulesServiceProvider\Installer->processExternalPackages() at n/a:n/a
 call_user_func_array() at /var/www/html/sp/system/Base/Providers/ModulesServiceProvider/Installer.php:111
 System\Base\Providers\ModulesServiceProvider\Installer->withProgress() at /var/www/html/sp/system/Base/Providers/ModulesServiceProvider/Installer.php:142
 System\Base\Providers\ModulesServiceProvider\Installer->runProcess() at /var/www/html/sp/apps/Core/Components/Modules/ModulesComponent.php:231
 Apps\Core\Components\Modules\ModulesComponent->processQueueAction() at n/a:n/a
 Phalcon\Dispatcher\AbstractDispatcher->callActionMethod() at n/a:n/a
 Phalcon\Dispatcher\AbstractDispatcher->dispatch() at n/a:n/a
 Phalcon\Mvc\Application->handle() at /var/www/html/sp/system/Bootstrap.php:114
 System\Bootstrap->mvc() at /var/www/html/sp/public/index.php:11

install [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--download-only] [--dev] [--no-suggest] [--no-dev] [--no-security-blocking] [--no-blocking] [--no-autoloader] [--no-progress] [--no-install] [--audit] [--audit-format AUDIT-FORMAT] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--strict-psr-autoloader] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--] [...]

I am not sure if I am explaining the problem correctly. The php script has been working for years, not sure which version upgrade is causing this loop. Please let me know and I can provide more information.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions