From 0e85116d756e38eb871e91e96a48a8647ecfd830 Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Thu, 6 Apr 2023 16:26:51 +0200 Subject: [PATCH] [TASK] Remove phpcpd (PHP Copy/Paste Detector) (#800) The project got archived and is not maintained anymore. Resolves: #796 --- .github/workflows/ci.yml | 1 - .github/workflows/predefined.yml | 9 --------- .gitlab/pipeline/jobs/php-copypaste-check.yml | 8 -------- Documentation/DependencyManager.rst | 5 +---- Documentation/Running.rst | 7 ------- composer.json | 4 ---- phive.xml | 1 - tools/phpcpd | Bin 70780 -> 0 bytes 8 files changed, 1 insertion(+), 34 deletions(-) delete mode 100644 .gitlab/pipeline/jobs/php-copypaste-check.yml delete mode 100755 tools/phpcpd diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30896b9..fd2470a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,6 @@ jobs: - "composer:normalize" - "composer:psr-verify" - "json:lint" - - "php:copypaste" - "php:cs-fixer" - "php:sniff" - "php:stan" diff --git a/.github/workflows/predefined.yml b/.github/workflows/predefined.yml index 1041f54..688e6c5 100644 --- a/.github/workflows/predefined.yml +++ b/.github/workflows/predefined.yml @@ -86,15 +86,6 @@ jobs: uses: TYPO3-Continuous-Integration/TYPO3-CI-PHPStan@v1 with: config_file: './phpstan.neon' - copypaste-detector: - name: "Copy'n'paste detector" - runs-on: ubuntu-22.04 - needs: php-lint - steps: - - name: "Checkout" - uses: actions/checkout@v3 - - name: "Run the Copy'n'paste Detector" - uses: TYPO3-Continuous-Integration/TYPO3-CI-Copy-Paste-Detector@v1 code-quality: name: "Code quality checks" runs-on: ubuntu-22.04 diff --git a/.gitlab/pipeline/jobs/php-copypaste-check.yml b/.gitlab/pipeline/jobs/php-copypaste-check.yml deleted file mode 100644 index 926b94a..0000000 --- a/.gitlab/pipeline/jobs/php-copypaste-check.yml +++ /dev/null @@ -1,8 +0,0 @@ -php-copypaste-check: - extends: .default - stage: codestyle - needs: - - build-composer-dependencies - - php-lint-php7.4 - script: - - composer ci:php:copypaste diff --git a/Documentation/DependencyManager.rst b/Documentation/DependencyManager.rst index e7bcdb8..e459971 100644 --- a/Documentation/DependencyManager.rst +++ b/Documentation/DependencyManager.rst @@ -15,7 +15,4 @@ a separate PHAR. This helps avoid dependency hell (which means that you cannot install or upgrade some tool as the tool's dependencies conflict with the dependencies on another library). It also allows running versions of tools that require a PHP version that is higher than the lowest allowed PHP version -for this project. Currently, we use PHIVE for -`PHP Copy/Paste Detector `__, -that requires PHP >= 7.3, which conflicts with this project's PHP version -support (we also support PHP 7.2). +for this project. diff --git a/Documentation/Running.rst b/Documentation/Running.rst index 532e36b..e2fe747 100644 --- a/Documentation/Running.rst +++ b/Documentation/Running.rst @@ -68,13 +68,6 @@ Lints the JSON files. Runs all static checks for the PHP files. -.. index:: Commands; composer ci:php:copypaste -.. code-block:: bash - - ddev composer ci:php:copypaste - -Checks for copy\'n\'pasted PHP code. - .. index:: Commands; composer ci:php:cs-fixer .. code-block:: bash diff --git a/composer.json b/composer.json index 9f0c990..e037e85 100644 --- a/composer.json +++ b/composer.json @@ -125,13 +125,11 @@ ], "ci:json:lint": "find . ! -path '*.Build/*' ! -path '*node_modules/*' -name '*.json' | xargs -r php .Build/vendor/bin/jsonlint -q", "ci:php": [ - "@ci:php:copypaste", "@ci:php:cs-fixer", "@ci:php:lint", "@ci:php:sniff", "@ci:php:stan" ], - "ci:php:copypaste": "@php ./tools/phpcpd Classes", "ci:php:cs-fixer": "php-cs-fixer fix --config .php-cs-fixer.php -v --dry-run --using-cache no --diff", "ci:php:lint": "find .*.php *.php Classes Configuration Tests -name '*.php' -print0 | xargs -r -0 -n 1 -P 4 php -l", "ci:php:sniff": "phpcs Classes Configuration Tests", @@ -139,7 +137,6 @@ "ci:static": [ "@ci:composer:normalize", "@ci:json:lint", - "@ci:php:copypaste", "@ci:php:cs-fixer", "@ci:php:lint", "@ci:php:sniff", @@ -202,7 +199,6 @@ "ci:dynamic": "Runs all PHPUnit tests (unit and functional).", "ci:json:lint": "Lints the JSON files.", "ci:php": "Runs all static checks for the PHP files.", - "ci:php:copypaste": "Checks for copy'n'pasted PHP code.", "ci:php:cs-fixer": "Checks the code style with the PHP Coding Standards Fixer (PHP-CS-Fixer).", "ci:php:lint": "Lints the PHP files for syntax errors.", "ci:php:sniff": "Checks the code style with PHP_CodeSniffer (PHPCS).", diff --git a/phive.xml b/phive.xml index 7ec6a97..e90bf18 100644 --- a/phive.xml +++ b/phive.xml @@ -1,6 +1,5 @@ - diff --git a/tools/phpcpd b/tools/phpcpd deleted file mode 100755 index 4ae9e337b5825a78a27c4faebcf7e381d3f7af45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70780 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 UU-->mEPnZwD_8E_-Mah#0N%5yoB#j-