diff --git a/.Build/gitlab-ci/README.md b/.Build/gitlab-ci/README.md new file mode 100644 index 0000000000000000000000000000000000000000..05bc181bc943aa488a516e3b6e0da3bcead51013 --- /dev/null +++ b/.Build/gitlab-ci/README.md @@ -0,0 +1,67 @@ + +# use as git subtree (preferred) + +## add gitlab-ci to your extension +``` +git subtree add --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main --squash +``` + +## add a .gitlab-ci.yml to your extension root, with this content +``` +include: + - local: '.Build/gitlab-ci/extension-gitlab-ci.yml' +``` + +## pull from remote +``` +git subtree pull --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main --squash +``` +## push from remote +``` +git subtree push --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main +``` +# use from remote repository + +## add a .gitlab-ci.yml to your extension root, with this content +``` +include: + - remote: 'https://git.slub-dresden.de/typo3/gitlab-ci/-/raw/main/extension-gitlab-ci.yml' +``` + +## create a .gitignore in your extension root, with this content +``` +composer.lock +/vendor +/public +.php_cs.cache +.php-cs-fixer.cache +``` +# use rector local +``` +composer require --dev ssch/typo3-rector +``` +## run rector +``` +./vendor/bin/rector process . --config .Build/gitlab-ci/typo3-rector/Extension.php +``` + +# use php-cs-fixer local +``` +composer require --dev friendsofphp/php-cs-fixer +``` + +## run php-cs-fixer +``` +./vendor/bin/php-cs-fixer fix --config .Build/gitlab-ci/php-cs-fixer/Extension.php +``` + +# use typo3-typoscript-lint local +``` +composer require --dev helmich/typo3-typoscript-lint +``` + +## run typo3-typoscript-lint +``` +vendor/bin/typoscript-lint -c .Build/gitlab-ci/typoscript-lint/Extension.yml --fail-on-warnings +``` + diff --git a/.Build/gitlab-ci/extension-gitlab-ci.yml b/.Build/gitlab-ci/extension-gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..9f6d3d388962ae304c1f0f59fc380e9eb4ea6d3e --- /dev/null +++ b/.Build/gitlab-ci/extension-gitlab-ci.yml @@ -0,0 +1,33 @@ + +stages: + - test +"PHP CS Fixer": + stage: test + image: ekreative/php-cs-fixer:3 + script: + - php-cs-fixer fix --dry-run --config=.Build/gitlab-ci/php-cs-fixer/Extension.php --diff --format=junit > php-report.xml + tags: + - docker + artifacts: + expire_in: 2 hours + reports: + junit: + - php-report.xml +"PHP Rector": + stage: test + image: composer:2 + tags: + - docker + before_script: + - composer global req ssch/typo3-rector + script: + - /tmp/vendor/bin/rector process . --config .Build/gitlab-ci/typo3-rector/Extension.php --dry-run +"TypoScript Linter": + stage: test + image: composer:2 + tags: + - docker + before_script: + - composer global req helmich/typo3-typoscript-lint + script: + - /tmp/vendor/bin/typoscript-lint -c .Build/gitlab-ci/typoscript-lint/Extension.yml --fail-on-warnings diff --git a/.Build/gitlab-ci/php-cs-fixer/Extension.php b/.Build/gitlab-ci/php-cs-fixer/Extension.php new file mode 100644 index 0000000000000000000000000000000000000000..92d273e46f403176cf6a5d11697dfd01a0d314dd --- /dev/null +++ b/.Build/gitlab-ci/php-cs-fixer/Extension.php @@ -0,0 +1,101 @@ +<?php +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +/** + * This file represents the configuration for Code Sniffing PSR-2-related + * automatic checks of coding guidelines + * Install @fabpot's great php-cs-fixer tool via + * + * $ composer global require friendsofphp/php-cs-fixer + * + * And then simply run + * + * $ ./bin/php-cs-fixer fix --config ./Build/gitlab-ci/php-cs-fixer/Extension.php + * + * inside the TYPO3 directory. Warning: This may take up to 10 minutes. + * + * For more information read: + * https://www.php-fig.org/psr/psr-2/ + * https://cs.sensiolabs.org + */ +if (PHP_SAPI !== 'cli') { + die('This script supports command line usage only. Please check your command.'); +} +// Define in which folders to search and which folders to exclude +// Exclude all files and directories from .gitignore +$finder = (new PhpCsFixer\Finder()) + ->ignoreVCSIgnored(true) + ->in(realpath(__DIR__ . '/../../../')); +// Return a Code Sniffing configuration using +// all sniffers needed for PSR-2 +// and additionally: +// - Remove leading slashes in use clauses. +// - PHP single-line arrays should not have trailing comma. +// - Single-line whitespace before closing semicolon are prohibited. +// - Remove unused use statements in the PHP source code +// - Ensure Concatenation to have at least one whitespace around +// - Remove trailing whitespace at the end of blank lines. +return (new \PhpCsFixer\Config()) + ->setRiskyAllowed(true) + ->setRules([ + '@DoctrineAnnotation' => true, + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'blank_line_after_opening_tag' => false, + 'braces' => ['allow_single_line_closure' => true], + 'cast_spaces' => ['space' => 'none'], + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'declare_equal_normalize' => ['space' => 'none'], + 'dir_constant' => true, + 'function_typehint_space' => true, + 'lowercase_cast' => true, + 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], + 'modernize_types_casting' => true, + 'native_function_casing' => true, + 'new_with_braces' => true, + 'no_alias_functions' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_blank_lines' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_null_property_initialization' => true, + 'no_short_bool_cast' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_superfluous_elseif' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_whitespace_in_blank_line' => true, + 'ordered_imports' => true, + 'php_unit_construct' => ['assertions' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame']], + 'php_unit_mock_short_will_return' => true, + 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'phpdoc_no_access' => true, + 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_scalar' => true, + 'phpdoc_trim' => true, + 'phpdoc_types' => true, + 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], + 'return_type_declaration' => ['space_before' => 'none'], + 'single_quote' => true, + 'single_line_comment_style' => ['comment_types' => ['hash']], + 'single_trait_insert_per_statement' => true, + 'trailing_comma_in_multiline' => ['elements' => ['arrays']], + 'whitespace_after_comma_in_array' => true, + ]) + ->setFinder($finder); diff --git a/.Build/gitlab-ci/php-cs-fixer/Project.php b/.Build/gitlab-ci/php-cs-fixer/Project.php new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.Build/gitlab-ci/project-gitlab-ci.yml b/.Build/gitlab-ci/project-gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.Build/gitlab-ci/typo3-rector/Extension.php b/.Build/gitlab-ci/typo3-rector/Extension.php new file mode 100644 index 0000000000000000000000000000000000000000..63f4c00e79a5e95957c24811cae3dbc4f6ad41f8 --- /dev/null +++ b/.Build/gitlab-ci/typo3-rector/Extension.php @@ -0,0 +1,96 @@ +<?php + +declare(strict_types=1); + +use Rector\Config\RectorConfig; +use Rector\Core\Configuration\Option; +use Rector\Core\ValueObject\PhpVersion; +use Rector\PostRector\Rector\NameImportingPostRector; +use Ssch\TYPO3Rector\Configuration\Typo3Option; +use Ssch\TYPO3Rector\Rector\General\ConvertImplicitVariablesToExplicitGlobalsRector; +use Ssch\TYPO3Rector\Rector\General\ExtEmConfRector; +use Ssch\TYPO3Rector\Set\Typo3LevelSetList; + +return static function (RectorConfig $rectorConfig): void { + + // If you want to override the number of spaces for your typoscript files you can define it here, the default value is 4 + // $parameters = $rectorConfig->parameters(); + // $parameters->set(Typo3Option::TYPOSCRIPT_INDENT_SIZE, 2); + + $rectorConfig->sets([ + Typo3LevelSetList::UP_TO_TYPO3_9, + Typo3LevelSetList::UP_TO_TYPO3_10, + Typo3LevelSetList::UP_TO_TYPO3_11, + ]); + + // Define your target version which you want to support + $rectorConfig->phpVersion(PhpVersion::PHP_74); + + // If you only want to process one/some TYPO3 extension(s), you can specify its path(s) here. + // If you use the option --config change __DIR__ to getcwd() + // $rectorConfig->paths([ + // __DIR__ . '/packages/acme_demo/', + // ]); + + // When you use rector there are rules that require some more actions like creating UpgradeWizards for outdated TCA types. + // To fully support you we added some warnings. So watch out for them. + + // If you use importNames(), you should consider excluding some TYPO3 files. + $rectorConfig->skip([ + // @see https://github.com/sabbelasichon/typo3-rector/issues/2536 + getcwd() . '/**/Configuration/ExtensionBuilder/*', + // We skip those directories on purpose as there might be node_modules or similar + // that include typescript which would result in false positive processing + getcwd() . '/**/Resources/**/node_modules/*', + getcwd() . '/**/Resources/**/NodeModules/*', + getcwd() . '/**/Resources/**/BowerComponents/*', + getcwd() . '/**/Resources/**/bower_components/*', + getcwd() . '/**/Resources/**/build/*', + getcwd() . '/vendor/*', + getcwd() . '/Build/*', + getcwd() . '/public/*', + getcwd() . '/.github/*', + getcwd() . '/.Build/*', + NameImportingPostRector::class => [ + 'ext_localconf.php', + 'ext_tables.php', + 'ClassAliasMap.php', + getcwd() . '/**/Configuration/*.php', + getcwd() . '/**/Configuration/**/*.php', + ] + ]); + + // If you have trouble that rector cannot run because some TYPO3 constants are not defined add an additional constants file + // @see https://github.com/sabbelasichon/typo3-rector/blob/master/typo3.constants.php + // @see https://github.com/rectorphp/rector/blob/main/docs/static_reflection_and_autoload.md#include-files + // $parameters->set(Option::BOOTSTRAP_FILES, [ + // __DIR__ . '/typo3.constants.php' + // ]); + + // register a single rule + // $rectorConfig->rule(\Ssch\TYPO3Rector\Rector\v9\v0\InjectAnnotationRector::class); + + /** + * Useful rule from RectorPHP itself to transform i.e. GeneralUtility::makeInstance('TYPO3\CMS\Core\Log\LogManager') + * to GeneralUtility::makeInstance(\TYPO3\CMS\Core\Log\LogManager::class) calls. + * But be warned, sometimes it produces false positives (edge cases), so watch out + */ + // $rectorConfig->rule(\Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class); + + // Optional non-php file functionalities: + // @see https://github.com/sabbelasichon/typo3-rector/blob/main/docs/beyond_php_file_processors.md + + // Rewrite your extbase persistence class mapping from typoscript into php according to official docs. + // This processor will create a summarized file with all the typoscript rewrites combined into a single file. + /* $rectorConfig->ruleWithConfiguration(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v10\v0\ExtbasePersistenceTypoScriptRector::class, [ + \Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v10\v0\ExtbasePersistenceTypoScriptRector::FILENAME => __DIR__ . '/packages/acme_demo/Configuration/Extbase/Persistence/Classes.php', + ]); */ + // Add some general TYPO3 rules + $rectorConfig->rule(ConvertImplicitVariablesToExplicitGlobalsRector::class); + $rectorConfig->ruleWithConfiguration(ExtEmConfRector::class, [ + ExtEmConfRector::ADDITIONAL_VALUES_TO_BE_REMOVED => [] + ]); + + // Modernize your TypoScript include statements for files and move from <INCLUDE /> to @import use the FileIncludeToImportStatementVisitor (introduced with TYPO3 9.0) + // $rectorConfig->rule(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v9\v0\FileIncludeToImportStatementTypoScriptRector::class); +}; diff --git a/.Build/gitlab-ci/typo3-rector/Project.php b/.Build/gitlab-ci/typo3-rector/Project.php new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.Build/gitlab-ci/typoscript-lint/Extension.yml b/.Build/gitlab-ci/typoscript-lint/Extension.yml new file mode 100644 index 0000000000000000000000000000000000000000..6f9c51b089362afa90c8538be0c6aa86c9e1b348 --- /dev/null +++ b/.Build/gitlab-ci/typoscript-lint/Extension.yml @@ -0,0 +1,22 @@ +paths: + - Configuration/ +filePatterns: + - "*.tsconfig" + - "*.typoscript" + - "ext_typoscript_*.txt" + - "setup.txt" + - "constants.txt" +sniffs: + - class: Indentation + parameters: + useSpaces: true + indentPerLevel: 2 + indentConditions: false + - class: DeadCode + - class: OperatorWhitespace + - class: RepeatingRValue + disabled: true + - class: EmptySection + - class: NestingConsistency + parameters: + commonPathPrefixThreshold: 1 diff --git a/.Build/gitlab-ci/typoscript-lint/Project.yml b/.Build/gitlab-ci/typoscript-lint/Project.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391