Skip to content

Using 8.2-dev-4.50.0 (gRPC extension) causes PHPCS to hang if --parallel is used #102

@mbomb007

Description

@mbomb007

For some reason, using wodby/drupal-php:8.2-dev-4.49.0 works, but images with wodby/drupal-php:8.2-dev-4.50.0 or newer cause PHPCS to hang, but only if PHPCS is run without verbose flag, or with the single-level verbosity -v. If PHPCS is run with -vv or -vvv, PHPCS runs successfully. The same problem occurs if I use PHP 8.3 instead of 8.2 and use the newest image and stability tag.

Further debugging revealed that this is because extra-verbose output means that sniffs cannot be run in parallel. Removing the --parallel option or setting --parallel=1 will also fix the hanging issue. Using a new image along with the --parallel option greater than 1 is what causes execution to hang.

My goal is to be able to use 4.51.0 or higher, since PHP 8.3 support was added.

Debugging Details and Steps to Reproduce

Click to view

The PHPCS command:

vendor/bin/phpcs -p -w  --colors --parallel=2 --standard=custom_ruleset.xml --extensions=engine,inc,install,module,php,profile,test,theme,yaml,yml --ignore=*/features/* ../web/modules/custom

custom_ruleset.xml

<?xml version="1.0"?>
<ruleset name="Drupal_Custom">
  <rule ref="Drupal" />
  <rule ref="DrupalPractice" />

  <rule ref="SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces" />
  <rule ref="SlevomatCodingStandard.Classes.ModernClassNameReference" />

  <rule ref="SlevomatCodingStandard.ControlStructures.DisallowContinueWithoutIntegerOperandInSwitch" />
  <rule ref="SlevomatCodingStandard.ControlStructures.DisallowYodaComparison" />
  <rule ref="SlevomatCodingStandard.ControlStructures.EarlyExit.UselessElseIf" />

  <rule ref="SlevomatCodingStandard.TypeHints.NullableTypeForNullDefaultValue" />
  <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing">
    <property name="spacesCountBeforeColon" value="1" />
  </rule>
  <rule ref="SlevomatCodingStandard.TypeHints.UnionTypeHintFormat">
    <property name="withSpaces" value="no" />
    <property name="shortNullable" value="yes" />
    <property name="nullPosition" value="last" />
  </rule>
</ruleset>

composer.json

{
    "require-dev": {
        "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
        "drupal/coder": "^8.3",
        "phpcompatibility/php-compatibility": "^9",
        "roave/security-advisories": "dev-latest",
        "squizlabs/php_codesniffer": "^3.8.1"
    },
    "prefer-stable": true,
    "scripts": {
        "install-codestandards": [
            "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run"
        ],
        "post-install-cmd": [
            "@install-codestandards"
        ],
        "post-update-cmd": [
            "@install-codestandards"
        ]
    },
    "config": {
        "sort-packages": true,
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true
        }
    }
}

The output when running hangs and the PHPCS command adds the first level of verbosity with -v:

Registering sniffs in the Drupal_Custom standard... DONE (172 sniffs registered)
Creating file list... DONE (13 files in queue)

Then the output hangs.

web_modules_custom.zip

This is almost the exact contents of the folder PHPCS is being run on. I excluded a composer.json file and changed a module's name.

If I run on an image with stability tag 4.49.0 or earlier, the same PHPCS command and composer.json runs successfully, regardless of the verbosity -v flag level included. This is the expected output:

Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 10 installs, 0 updates, 0 removals
  - Downloading squizlabs/php_codesniffer (3.8.1)
  - Downloading dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Downloading symfony/polyfill-ctype (v1.28.0)
  - Downloading symfony/yaml (v7.0.0)
  - Downloading phpstan/phpdoc-parser (1.25.0)
  - Downloading slevomat/coding-standard (8.14.1)
  - Downloading sirbrillig/phpcs-variable-analysis (v2.11.17)
  - Downloading drupal/coder (8.3.22)
  - Downloading phpcompatibility/php-compatibility (9.3.5)
  - Installing squizlabs/php_codesniffer (3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.28.0): Extracting archive
  - Installing symfony/yaml (v7.0.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.25.0): Extracting archive
  - Installing slevomat/coding-standard (8.14.1): Extracting archive
  - Installing sirbrillig/phpcs-variable-analysis (v2.11.17): Extracting archive
  - Installing drupal/coder (8.3.22): Extracting archive
  - Installing phpcompatibility/php-compatibility (9.3.5): Extracting archive
  - Installing roave/security-advisories (dev-latest b7a13fc)
Generating autoload files
5 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
PHP CodeSniffer Config installed_paths set to ../../drupal/coder/coder_sniffer,../../phpcompatibility/php-compatibility,../../sirbrillig/phpcs-variable-analysis,../../slevomat/coding-standard
> PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin::run

vendor/bin/phpcs -v -p -w  --colors --parallel=2 --standard=custom_ruleset.xml --extensions=engine,inc,install,module,php,profile,test,theme,yaml,yml --ignore=*/features/* ../web/modules/custom

Registering sniffs in the Drupal_Custom standard... DONE (172 sniffs registered)
Creating file list... DONE (13 files in queue)
Changing into directory /builds/web/html/web/modules/custom/vite
Processing drush.services.yml [PHP => 7 tokens in 7 lines]... DONE in 9ms (0 errors, 0 warnings)
Processing vite.info.yml [PHP => 6 tokens in 6 lines]... DONE in 5ms (0 errors, 0 warnings)
Processing vite.libraries.yml [PHP => 5 tokens in 5 lines]... DONE in 0ms (0 errors, 0 warnings)
Processing vite.links.menu.yml [PHP => 6 tokens in 6 lines]... DONE in 0ms (0 errors, 0 warnings)
Processing vite.module [PHP => 922 tokens in 120 lines]... DONE in 53ms (0 errors, 0 warnings)
Processing vite.routing.yml [PHP => 7 tokens in 7 lines]... DONE in 0ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/disable_user_edit/src/Services
Processing RouteSubscriber.php [PHP => 172 tokens in 30 lines]... DONE in 36ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/disable_user_edit
Processing disable_user_edit.info.yml [PHP => 5 tokens in 5 lines]... DONE in 6ms (0 errors, 0 warnings)
Processing disable_user_edit.services.yml [PHP => 5 tokens in 5 lines]... DONE in 0ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/vite/config/optional
Processing vite.settings.yml [PHP => 2 tokens in 2 lines]... DONE in 0ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/vite/src/Commands
Processing ViteCommands.php [PHP => 500 tokens in 78 lines]... DONE in 20ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/vite/src/Form
Processing ViteSettingsForm.php [PHP => 405 tokens in 64 lines]... DONE in 15ms (0 errors, 0 warnings)
Changing into directory /builds/web/html/web/modules/custom/vite/src/Helper
Processing Vite.php [PHP => 127 tokens in 31 lines]... DONE in 2ms (0 errors, 0 warnings)
Time: 202ms; Memory: 8MB

Debugging Update & Workaround

After trying a couple more things, I found that either removing --parallel from the PHPCS command, or setting its value to 1, will fix issue on the newer images. This also makes sense with the verbosity flags since, I assume, when verbose is enabled at a high level then sniffing cannot be parallelized.

So, this means that the newer images break parallel execution of sniffs for some reason. Removing the --parallel option isn't ideal, obviously, as this increases the execution time. So hopefully this information can point towards the cause of the issue and a fix to follow.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions