WordPress.org

Make WordPress Core

Changeset 46290


Ignore:
Timestamp:
09/25/2019 01:46:55 PM (2 months ago)
Author:
desrosj
Message:

Build/Test Tools: Introduce automated PHP compatibility checking.

This change introduces a new Composer script, compat that will scan the codebase for (detectable) potential PHP compatibility issues using the PHP_CodeSniffer and a custom ruleset based off of the PHPCompayibilityWP ruleset (phpcompat.xml.dist).

The command will be run as a separate job within each Travis build. While many compatibility issues and false positives have already been corrected in this commit and other Trac tickets, there are still some remaining. For that reason, the job is allowed to fail while the remainder of the potential compatibility issues are investigated and addressed. After those are resolved, the job should be set as required to pass to help prevent new compatibility issues from being introduced.

Props desrosj, jrf, all PHPCompatibilityWP and PHPCompatibility contributors.
Fixes #46152.

Location:
trunk
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/.travis.yml

    r46114 r46290  
    3030  - env: WP_TRAVISCI=travis:js WP_INSTALL=false
    3131    name: JS Tests
     32  - env: WP_TRAVISCI=test:compat COMPOSER_INSTALL=true NPM_INSTALL=false WP_INSTALL=false
     33    name: "PHP Compatibility Check"
    3234  - env: LOCAL_PHP=7.3-fpm WP_TRAVISCI=test:php
    3335    name: "PHPUnit Tests: PHP 7.3"
     
    4749    name: "PHPUnit Tests: PHP 8.0"
    4850  allow_failures:
     51  - env: WP_TRAVISCI=test:compat COMPOSER_INSTALL=true NPM_INSTALL=false WP_INSTALL=false
    4952  - env: LOCAL_PHP=7.4-fpm WP_TRAVISCI=test:php
    5053  - env: LOCAL_PHP=8.0-fpm WP_TRAVISCI=test:php
     
    121124      docker-compose run --rm php composer lint:errors &&
    122125      docker-compose run --rm php composer lint tests
     126    elif [[ "$WP_TRAVISCI" == "test:compat" ]]; then
     127      docker-compose run --rm php composer compat
    123128    else
    124129      npm run grunt $WP_TRAVISCI
  • trunk/composer.json

    r46200 r46290  
    1515    "require-dev": {
    1616        "dealerdirect/phpcodesniffer-composer-installer": "~0.5.0",
    17         "wp-coding-standards/wpcs": "~2.1.0"
     17        "wp-coding-standards/wpcs": "~2.1.0",
     18        "phpcompatibility/phpcompatibility-wp": "^2.1.0"
    1819    },
    1920    "scripts": {
     21        "compat": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs --standard=phpcompat.xml.dist --report=summary,source",
    2022        "format": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf --report=summary,source --cache -d memory_limit=256M",
    2123        "lint": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs --report=summary,source --cache -d memory_limit=256M",
  • trunk/composer.lock

    r46200 r46290  
    55        "This file is @generated automatically"
    66    ],
    7     "content-hash": "56c797c5309702adf0f49bd274a364f3",
     7    "content-hash": "ca8f46e0b3cba61c076c033cc7143d3a",
    88    "packages": [],
    99    "packages-dev": [
     
    7373            ],
    7474            "time": "2018-10-26T13:21:45+00:00"
     75        },
     76        {
     77            "name": "phpcompatibility/php-compatibility",
     78            "version": "9.3.1",
     79            "source": {
     80                "type": "git",
     81                "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
     82                "reference": "9999344e47e7af6b00e1a898eacc4e4368fb7196"
     83            },
     84            "dist": {
     85                "type": "zip",
     86                "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9999344e47e7af6b00e1a898eacc4e4368fb7196",
     87                "reference": "9999344e47e7af6b00e1a898eacc4e4368fb7196",
     88                "shasum": ""
     89            },
     90            "require": {
     91                "php": ">=5.3",
     92                "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
     93            },
     94            "conflict": {
     95                "squizlabs/php_codesniffer": "2.6.2"
     96            },
     97            "require-dev": {
     98                "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
     99            },
     100            "suggest": {
     101                "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
     102                "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
     103            },
     104            "type": "phpcodesniffer-standard",
     105            "notification-url": "https://packagist.org/downloads/",
     106            "license": [
     107                "LGPL-3.0-or-later"
     108            ],
     109            "authors": [
     110                {
     111                    "name": "Wim Godden",
     112                    "homepage": "https://github.com/wimg",
     113                    "role": "lead"
     114                },
     115                {
     116                    "name": "Juliette Reinders Folmer",
     117                    "homepage": "https://github.com/jrfnl",
     118                    "role": "lead"
     119                },
     120                {
     121                    "name": "Contributors",
     122                    "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
     123                }
     124            ],
     125            "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
     126            "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
     127            "keywords": [
     128                "compatibility",
     129                "phpcs",
     130                "standards"
     131            ],
     132            "time": "2019-09-05T18:36:49+00:00"
     133        },
     134        {
     135            "name": "phpcompatibility/phpcompatibility-paragonie",
     136            "version": "1.1.0",
     137            "source": {
     138                "type": "git",
     139                "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git",
     140                "reference": "b1bb79a7cab1fb856b56f1b5cf110b6e52d8e936"
     141            },
     142            "dist": {
     143                "type": "zip",
     144                "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/b1bb79a7cab1fb856b56f1b5cf110b6e52d8e936",
     145                "reference": "b1bb79a7cab1fb856b56f1b5cf110b6e52d8e936",
     146                "shasum": ""
     147            },
     148            "require": {
     149                "phpcompatibility/php-compatibility": "^9.0"
     150            },
     151            "require-dev": {
     152                "dealerdirect/phpcodesniffer-composer-installer": "^0.5",
     153                "paragonie/random_compat": "dev-master",
     154                "paragonie/sodium_compat": "dev-master"
     155            },
     156            "suggest": {
     157                "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
     158                "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
     159            },
     160            "type": "phpcodesniffer-standard",
     161            "notification-url": "https://packagist.org/downloads/",
     162            "license": [
     163                "LGPL-3.0-or-later"
     164            ],
     165            "authors": [
     166                {
     167                    "name": "Wim Godden",
     168                    "role": "lead"
     169                },
     170                {
     171                    "name": "Juliette Reinders Folmer",
     172                    "role": "lead"
     173                }
     174            ],
     175            "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.",
     176            "homepage": "http://phpcompatibility.com/",
     177            "keywords": [
     178                "compatibility",
     179                "paragonie",
     180                "phpcs",
     181                "polyfill",
     182                "standards"
     183            ],
     184            "time": "2019-08-28T15:58:19+00:00"
     185        },
     186        {
     187            "name": "phpcompatibility/phpcompatibility-wp",
     188            "version": "2.1.0",
     189            "source": {
     190                "type": "git",
     191                "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git",
     192                "reference": "41bef18ba688af638b7310666db28e1ea9158b2f"
     193            },
     194            "dist": {
     195                "type": "zip",
     196                "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/41bef18ba688af638b7310666db28e1ea9158b2f",
     197                "reference": "41bef18ba688af638b7310666db28e1ea9158b2f",
     198                "shasum": ""
     199            },
     200            "require": {
     201                "phpcompatibility/php-compatibility": "^9.0",
     202                "phpcompatibility/phpcompatibility-paragonie": "^1.0"
     203            },
     204            "require-dev": {
     205                "dealerdirect/phpcodesniffer-composer-installer": "^0.5"
     206            },
     207            "suggest": {
     208                "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
     209                "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
     210            },
     211            "type": "phpcodesniffer-standard",
     212            "notification-url": "https://packagist.org/downloads/",
     213            "license": [
     214                "LGPL-3.0-or-later"
     215            ],
     216            "authors": [
     217                {
     218                    "name": "Wim Godden",
     219                    "role": "lead"
     220                },
     221                {
     222                    "name": "Juliette Reinders Folmer",
     223                    "role": "lead"
     224                }
     225            ],
     226            "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.",
     227            "homepage": "http://phpcompatibility.com/",
     228            "keywords": [
     229                "compatibility",
     230                "phpcs",
     231                "standards",
     232                "wordpress"
     233            ],
     234            "time": "2019-08-28T14:22:28+00:00"
    75235        },
    76236        {
     
    177337    "prefer-lowest": false,
    178338    "platform": {
    179       "php": ">=5.6"
     339        "php": ">=5.6"
    180340    },
    181341    "platform-dev": []
  • trunk/src/wp-admin/includes/class-wp-debug-data.php

    r46228 r46290  
    729729            $client_version = $wpdb->dbh->client_info;
    730730        } else {
    731             // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info
     731            // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved
    732732            if ( preg_match( '|[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}|', mysql_get_client_info(), $matches ) ) {
    733733                $client_version = $matches[0];
  • trunk/src/wp-admin/includes/class-wp-site-health.php

    r46269 r46290  
    159159            $mysql_server_type = mysqli_get_server_info( $wpdb->dbh );
    160160        } else {
    161             // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_server_info
     161            // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_server_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved
    162162            $mysql_server_type = mysql_get_server_info( $wpdb->dbh );
    163163        }
     
    11721172            $mysql_client_version = mysqli_get_client_info();
    11731173        } else {
    1174             // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info
     1174            // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved
    11751175            $mysql_client_version = mysql_get_client_info();
    11761176        }
  • trunk/src/wp-admin/includes/file.php

    r46232 r46290  
    12811281            array(
    12821282                'php'    => phpversion(),
     1283                // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
    12831284                'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
    12841285            )
     
    13141315                array(
    13151316                    'php'                => phpversion(),
     1317                    // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
    13161318                    'sodium'             => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
    13171319                    'polyfill_is_fast'   => false,
     
    13871389            'skipped_sig' => $skipped_signature,
    13881390            'php'         => phpversion(),
     1391            // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
    13891392            'sodium'      => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
    13901393        )
  • trunk/src/wp-admin/includes/upgrade.php

    r46284 r46290  
    24762476 * @return mixed
    24772477 */
    2478 function __get_option( $setting ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     2478function __get_option( $setting ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    24792479    global $wpdb;
    24802480
  • trunk/src/wp-includes/author-template.php

    r45932 r46290  
    566566 * @access private
    567567 */
    568 function __clear_multi_author_cache() { //phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     568function __clear_multi_author_cache() { //phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    569569    delete_transient( 'is_multi_author' );
    570570}
  • trunk/src/wp-includes/deprecated.php

    r46225 r46290  
    17991799 * @see _n()
    18001800 */
    1801 function __ngettext( ...$args ) {
     1801function __ngettext( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    18021802    _deprecated_function( __FUNCTION__, '2.8.0', '_n()' );
    18031803    return _n( ...$args );
     
    18111811 * @see _n_noop()
    18121812 */
    1813 function __ngettext_noop( ...$args ) {
     1813function __ngettext_noop( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    18141814    _deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' );
    18151815    return _n_noop( ...$args );
  • trunk/src/wp-includes/functions.php

    r46214 r46290  
    57445744 * @return true True.
    57455745 */
    5746 function __return_true() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5746function __return_true() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    57475747    return true;
    57485748}
     
    57595759 * @return false False.
    57605760 */
    5761 function __return_false() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5761function __return_false() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    57625762    return false;
    57635763}
     
    57725772 * @return int 0.
    57735773 */
    5774 function __return_zero() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5774function __return_zero() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    57755775    return 0;
    57765776}
     
    57855785 * @return array Empty array.
    57865786 */
    5787 function __return_empty_array() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5787function __return_empty_array() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    57885788    return array();
    57895789}
     
    57985798 * @return null Null value.
    57995799 */
    5800 function __return_null() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5800function __return_null() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    58015801    return null;
    58025802}
     
    58135813 * @return string Empty string.
    58145814 */
    5815 function __return_empty_string() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     5815function __return_empty_string() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    58165816    return '';
    58175817}
  • trunk/src/wp-includes/general-template.php

    r46163 r46290  
    46854685 * @return string html attribute or empty string
    46864686 */
    4687 function __checked_selected_helper( $helper, $current, $echo, $type ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore
     4687function __checked_selected_helper( $helper, $current, $echo, $type ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
    46884688    if ( (string) $helper === (string) $current ) {
    46894689        $result = " $type='$type'";
Note: See TracChangeset for help on using the changeset viewer.