From 428a764634ff5da10a14c4c60659766b819de48e Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 14 Sep 2022 11:24:52 +0200 Subject: [PATCH 01/60] [TASK] Add composer plugin to tdk --- composer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 63f0366..829b711 100644 --- a/composer.json +++ b/composer.json @@ -86,7 +86,8 @@ "typo3/cms-t3editor": "@dev", "typo3/cms-tstemplate": "@dev", "typo3/cms-viewpage": "@dev", - "typo3/cms-workspaces": "@dev" + "typo3/cms-workspaces": "@dev", + "ochorocho/tdk-composer-plugin": "@dev" }, "require-dev": { "codeception/codeception": "*", @@ -101,7 +102,8 @@ "config": { "allow-plugins": { "typo3/class-alias-loader": true, - "typo3/cms-composer-installers": true + "typo3/cms-composer-installers": true, + "ochorocho/tdk-composer-plugin": true } } } From 3cb4f067ddaf2508c33bde225cb99e3ed5a17b98 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Thu, 15 Sep 2022 22:34:06 +0200 Subject: [PATCH 02/60] [TASK] Migrate hook script to composer plugin --- .gitignore | 1 + Scripts/HookScript.php | 89 ------------- packages/tdk-composer-plugin/.gitignore | 2 + packages/tdk-composer-plugin/composer.json | 19 +++ .../src/Command/CommandProvider.php | 19 +++ .../src/Command/HookCommand.php | 122 ++++++++++++++++++ .../src/Command/TdkCommand.php | 56 ++++++++ packages/tdk-composer-plugin/src/Plugin.php | 43 ++++++ .../src/Service/BaseService.php | 18 +++ .../src/Service/HookService.php | 40 ++++++ .../src/Service/ValidationService.php | 73 +++++++++++ tests/Acceptance/TdkCest.php | 4 +- 12 files changed, 395 insertions(+), 91 deletions(-) delete mode 100644 Scripts/HookScript.php create mode 100644 packages/tdk-composer-plugin/.gitignore create mode 100644 packages/tdk-composer-plugin/composer.json create mode 100644 packages/tdk-composer-plugin/src/Command/CommandProvider.php create mode 100644 packages/tdk-composer-plugin/src/Command/HookCommand.php create mode 100644 packages/tdk-composer-plugin/src/Command/TdkCommand.php create mode 100644 packages/tdk-composer-plugin/src/Plugin.php create mode 100644 packages/tdk-composer-plugin/src/Service/BaseService.php create mode 100644 packages/tdk-composer-plugin/src/Service/HookService.php create mode 100644 packages/tdk-composer-plugin/src/Service/ValidationService.php diff --git a/.gitignore b/.gitignore index fa0c5db..75fbc0d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ composer.lock typo3-core packages/* !packages/.gitkeep +!packages/tdk-composer-plugin .ddev/ /config/ test-acceptance-tdk/ diff --git a/Scripts/HookScript.php b/Scripts/HookScript.php deleted file mode 100644 index e363430..0000000 --- a/Scripts/HookScript.php +++ /dev/null @@ -1,89 +0,0 @@ - 'enableCommitMessage', - 'message' => 'Setup Commit Message Hook? [y/n] ', - 'default' => true - ], - [ - 'method' => 'enablePreCommit', - 'message' => 'Setup Pre Commit Hook? [y/n] ', - 'default' => true - ], - ]; - - $force = (bool)(GitScript::getArguments($event->getArguments())['force'] ?? getenv('TDK_HOOK_FORCE_CREATE') ?? false); - foreach ($questions as $question) { - if ($force) { - $answer = true; - } else { - $answer = $event->getIO()->askConfirmation($question['message'], $question['default']); - } - - if ($answer) { - $method = $question['method']; - static::$method($event); - } - } - } - - public static function remove(Event $event) - { - $filesystem = new Filesystem(); - $filesystem->remove([ - self::$coreDevFolder . '/.git/hooks/pre-commit', - self::$coreDevFolder . '/.git/hooks/commit-msg', - ]); - } - - private static function enableCommitMessage(Event $event) - { - $filesystem = new Filesystem(); - - try { - $targetCommitMsg = self::$coreDevFolder . '/.git/hooks/commit-msg'; - $filesystem->copy(self::$coreDevFolder . '/Build/git-hooks/commit-msg', $targetCommitMsg); - - if (!is_executable($targetCommitMsg)) { - $filesystem->chmod($targetCommitMsg, 0755); - } - - $event->getIO()->write('Created Commit Message Hook'); - } catch (IOException $e) { - $event->getIO()->writeError('Exception:enableCommitMessageHook:' . $e->getMessage() . ''); - } - } - - private static function enablePreCommit(Event $event) - { - if (DIRECTORY_SEPARATOR === '\\') { - return; - } - $filesystem = new Filesystem(); - try { - $targetPreCommit = self::$coreDevFolder . '/.git/hooks/pre-commit'; - $filesystem->copy(self::$coreDevFolder . '/Build/git-hooks/unix+mac/pre-commit', $targetPreCommit); - - if (!is_executable($targetPreCommit)) { - $filesystem->chmod($targetPreCommit, 0755); - } - - $event->getIO()->write('Created Pre Commit Hook'); - } catch (IOException $e) { - $event->getIO()->writeError('Exception:enablePreCommitHook:' . $e->getMessage() . ''); - } - } -} diff --git a/packages/tdk-composer-plugin/.gitignore b/packages/tdk-composer-plugin/.gitignore new file mode 100644 index 0000000..351baa5 --- /dev/null +++ b/packages/tdk-composer-plugin/.gitignore @@ -0,0 +1,2 @@ +/composer.lock +/vendor \ No newline at end of file diff --git a/packages/tdk-composer-plugin/composer.json b/packages/tdk-composer-plugin/composer.json new file mode 100644 index 0000000..3fefc6e --- /dev/null +++ b/packages/tdk-composer-plugin/composer.json @@ -0,0 +1,19 @@ +{ + "name": "ochorocho/tdk-composer-plugin", + "description": "TYPO3 Development Kit additional Composer commands", + "license": "GPL-2.0-or-later", + "type": "composer-plugin", + "require": { + "composer/composer": "^2.4", + "composer-plugin-api": "^2.3" + }, + "autoload": { + "psr-4": { + "Ochorocho\\TdkComposer\\": "src/" + } + }, + "extra": { + "class": "Ochorocho\\TdkComposer\\Plugin", + "plugin-modifies-downloads": true + } +} diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php new file mode 100644 index 0000000..e88682f --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -0,0 +1,19 @@ +setName('tdk-plugin:hooks') + ->setDescription('Enable hooks') + ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to overwrite hooks') + ->addArgument('action', InputOption::VALUE_NONE, 'Create/delete hooks') + ->setHelp(<<output = $output; + $this->hookService = new HookService(); + + $hooks = ['commit-msg', 'pre-commit']; + $action = $input->getArgument('action'); + $force = (bool)($input->getOption('force') ?? getenv('TDK_HOOK_FORCE_CREATE') ?? false); + $helper = $this->getHelper('question'); + + switch ($action) { + case 'create': + $actionLabel = 'Create'; + break; + case 'delete': + $actionLabel = 'Delete'; + break; + case 'info': + return $this->info($hooks); + } + + $code = Command::SUCCESS; + foreach ($hooks as $file) { + if ($force) { + $answer = true; + } else { + $message = $actionLabel . ' "' . $file . '" Hook? [y/n] '; + $question = new ConfirmationQuestion($message, true); + $answer = $helper->ask($input, $output, $question); + } + + if ($answer) { + switch ($action) { + case 'create': + $code = $this->create($file); + break; + case 'delete': + $code = $this->delete($file); + break; + } + } + } + + return $code; + } + + protected function delete(string $file): int + { + try { + $this->hookService->delete((array)$file); + $this->output->writeln('Deleted "' . $file . '" hook'); + return Command::SUCCESS; + } catch (IOException $e) { + $this->output->writeln('Failed to delete "' . $file . '" hook:' . $e->getMessage() . ''); + return Command::FAILURE; + } + } + + protected function info(array $hooks): int + { + $code = Command::SUCCESS; + foreach ($hooks as $file) { + if ($this->hookService->exists($file)) { + $this->output->writeln('βœ… Hook "' . $file . '" exists'); + } else { + $this->output->writeln('❌ Hook "' . $file . '" does not exist'); + $code = Command::FAILURE; + } + } + + if ($code !== Command::SUCCESS) { + $this->output->writeln('You may run "composer tdk-plugin:hooks create"'); + } + + return $code; + } + + protected function create(string $file): int + { + try { + $this->hookService->create($file); + $this->output->writeln('Created "' . $file . '" hook'); + return Command::SUCCESS; + } catch (IOException $e) { + $this->output->writeln('Failed to create "' . $file . '" hook:' . $e->getMessage() . ''); + return Command::FAILURE; + } + } +} diff --git a/packages/tdk-composer-plugin/src/Command/TdkCommand.php b/packages/tdk-composer-plugin/src/Command/TdkCommand.php new file mode 100644 index 0000000..7db7d7e --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/TdkCommand.php @@ -0,0 +1,56 @@ +setName('tdk:package') + ->setDescription('Generate a package for Gitlab') + ->setDefinition([ + new InputOption('json', 'j', InputOption::VALUE_REQUIRED, 'Composer json file', 'composer.json'), + ]) + ->setHelp(<<requireComposer(); + $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'package', $input, $output); + $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); + $output->writeln('Hooooray .... '); + } +} diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php new file mode 100644 index 0000000..436a8d8 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -0,0 +1,43 @@ + CommandProvider::class + ]; + } + + public function deactivate(Composer $composer, IOInterface $io) + { + // TODO: Implement deactivate() method. + } + + public function uninstall(Composer $composer, IOInterface $io) + { + // TODO: Implement uninstall() method. + } +} diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php new file mode 100644 index 0000000..878639b --- /dev/null +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -0,0 +1,18 @@ +filesystem = new Filesystem(); + } +} diff --git a/packages/tdk-composer-plugin/src/Service/HookService.php b/packages/tdk-composer-plugin/src/Service/HookService.php new file mode 100644 index 0000000..7d5c88a --- /dev/null +++ b/packages/tdk-composer-plugin/src/Service/HookService.php @@ -0,0 +1,40 @@ +coreDevFolder . '/.git/hooks/' . $value; + }, $files); + + $this->filesystem->remove($filePaths); + } + + public function create(string $fileName): void + { + $finder = new Finder(); + $hookTarget = $this->coreDevFolder . '/.git/hooks/' . $fileName; + $files = $finder->name($fileName)->in($this->coreDevFolder . '/Build/git-hooks/')->files(); + foreach ($files as $file) { + $this->filesystem->copy($file->getPath() . '/' . $file->getFilename(), $hookTarget); + } + + if (!is_executable($hookTarget)) { + $this->filesystem->chmod($hookTarget, 0755); + } + } + + public function exists($hook): bool + { + $hookTarget = $this->coreDevFolder . '/.git/hooks/' . $hook; + return $this->filesystem->exists($hookTarget); + } +} diff --git a/packages/tdk-composer-plugin/src/Service/ValidationService.php b/packages/tdk-composer-plugin/src/Service/ValidationService.php new file mode 100644 index 0000000..7dc77ab --- /dev/null +++ b/packages/tdk-composer-plugin/src/Service/ValidationService.php @@ -0,0 +1,73 @@ +getIO(), $event->getComposer()->getConfig()); + $json = $request->get('https://review.typo3.org/accounts/' . urlencode($username) . '/?pp=0'); + + // Gerrit does not return valid JSON using their JSON API + // therefore we need to chop off the first line + // Sounds weird? See why https://gerrit-review.googlesource.com/Documentation/rest-api.html#output + $validJson = str_replace(')]}\'', '', $json->getBody()); + + return json_decode($validJson, true, 512, JSON_THROW_ON_ERROR); + } +} diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index 08c9192..d418e6c 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -81,7 +81,7 @@ public function enableHooks(AcceptanceTester $I): void $hooksFolder = self::$testFolder . self::$coreDevFolder . '.git/hooks/'; $I->amGoingTo('Enable the hooks'); - $I->runShellCommand('composer tdk:enable-hooks -- --force'); + $I->runShellCommand('composer tdk-plugin:hooks create --force'); $I->seeResultCodeIs(0); $I->seeFileFound('commit-msg', $hooksFolder); @@ -166,7 +166,7 @@ public function removeHooks(AcceptanceTester $I) $hooksFolder = self::$testFolder . self::$coreDevFolder . '.git/hooks/'; $I->amGoingTo('Delete the hooks'); - $I->runShellCommand('composer tdk:remove-hooks'); + $I->runShellCommand('composer tdk-plugin:hooks delete --force'); $I->seeResultCodeIs(0); $I->dontSeeFileFound('commit-msg', $hooksFolder); From f726ced876db111706ef7fe547b126dc51391e73 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Fri, 16 Sep 2022 01:25:13 +0200 Subject: [PATCH 03/60] [TASK] Migrate git script to composer plugin command --- Scripts/GitScript.php | 132 --------------- .../src/Command/CommandProvider.php | 2 +- .../src/Command/GitCommand.php | 159 ++++++++++++++++++ .../src/Command/HookCommand.php | 29 ++-- .../src/Command/TdkCommand.php | 56 ------ .../src/Service/GitService.php | 67 ++++++++ .../src/Service/HookService.php | 1 - .../src/Service/ValidationService.php | 55 +++--- 8 files changed, 267 insertions(+), 234 deletions(-) delete mode 100644 Scripts/GitScript.php create mode 100644 packages/tdk-composer-plugin/src/Command/GitCommand.php delete mode 100644 packages/tdk-composer-plugin/src/Command/TdkCommand.php create mode 100644 packages/tdk-composer-plugin/src/Service/GitService.php diff --git a/Scripts/GitScript.php b/Scripts/GitScript.php deleted file mode 100644 index 455bb3b..0000000 --- a/Scripts/GitScript.php +++ /dev/null @@ -1,132 +0,0 @@ -getArguments()); - $validator = ValidatorScript::username($event); - - $username = $arguments['username'] ?? getenv('TDK_USERNAME') ?? false; - if ($username === 'none') { - return 0; - } - - if ($username) { - $userData = $validator($username); - } else { - $userData = $event->getIO()->askAndValidate('What is your TYPO3/Gerrit Account Username? ', $validator, 2); - } - - $pushUrl = 'ssh://' . $userData['username'] . '@review.typo3.org:29418/Packages/TYPO3.CMS.git'; - self::setGitConfigValue($event, 'remote.origin.pushurl', $pushUrl); - self::setGitConfigValue($event, 'user.name', $userData['display_name'] ?? $userData['name'] ?? $userData['username']); - self::setGitConfigValue($event, 'user.email', $userData['email']); - - return 0; - } - - public static function setCommitTemplate(Event $event) - { - $arguments = self::getArguments($event->getArguments()); - $validator = ValidatorScript::filePath(); - - if ($arguments['file'] ?? false) { - $file = $validator($arguments['file']); - } else { - $file = $event->getIO()->askAndValidate('Set TYPO3 commit message template [default: .gitmessage.txt] ?', $validator, 3, '.gitmessage.txt'); - } - - $process = new ProcessExecutor(); - $template = realpath($file); - $status = $process->execute('git config commit.template ' . $template, $output, self::$coreDevFolder); - - if ($status) { - $event->getIO()->writeError('Could not enable Git Commit Template!'); - } else { - $event->getIO()->write('Set "commit.template" to ' . $template . ' '); - } - } - - public static function applyPatch(Event $event) - { - $ref = self::getArguments($event->getArguments())['ref'] ?? getenv('TDK_PATCH_REF') ?? false; - if (empty($ref)) { - $event->getIO()->write('No patch ref given'); - return 1; - } - - $filesystem = new Filesystem(); - if ($filesystem->exists(self::$coreDevFolder)) { - $process = new ProcessExecutor(); - $command = 'git fetch https://review.typo3.org/Packages/TYPO3.CMS ' . $ref . ' && git cherry-pick FETCH_HEAD'; - $event->getIO()->write('Apply patch ' . $ref . ''); - $status = $process->executeTty($command, self::$coreDevFolder); - - if ($status) { - $event->getIO()->write('Could not apply patch ' . $ref . ' '); - } - } else { - $event->getIO()->write('Could not apply patch, repository does not exist. Please run "composer tdk:clone"'); - } - - return 0; - } - - public static function cloneRepository(Event $event): void - { - $filesystem = new Filesystem(); - if (!$filesystem->exists(self::$coreDevFolder)) { - $process = new ProcessExecutor(); - $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; - $command = sprintf('git clone %s %s', ProcessExecutor::escape($gitRemoteUrl), ProcessExecutor::escape(self::$coreDevFolder)); - $event->getIO()->write('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $status = $process->executeTty($command); - - if ($status) { - $event->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); - } - } else { - $event->getIO()->write('Repository exists! Therefore no download required.'); - } - } - - public static function checkoutBranch(Event $event) - { - $branch = self::getArguments($event->getArguments())['branch'] ?? getenv('TDK_BRANCH') ?? false; - if (empty($branch)) { - $event->getIO()->write('No branch name given'); - return 1; - } - - $process = new ProcessExecutor(); - $command = sprintf('git checkout %s', ProcessExecutor::escape($branch)); - $event->getIO()->write('Checking out branch "' . $branch . '"!'); - $status = $process->executeTty($command, self::$coreDevFolder); - if ($status) { - $event->getIO()->write('Could not checkout branch ' . $branch . ' '); - } - - return 0; - } - - private static function setGitConfigValue(Event $event, string $config, string $value): void - { - $process = new ProcessExecutor(); - $command = 'git config ' . $config . ' "' . $value . '"'; - $status = $process->execute($command, $output, self::$coreDevFolder); - if ($status > 0) { - $event->getIO()->writeError('Could not set "' . $config . '" to "' . $value . '"'); - } else { - $event->getIO()->write('Set "' . $config . '" to "' . $value . '"'); - } - } -} diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index e88682f..aad3c0d 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -12,7 +12,7 @@ final class CommandProvider public function getCommands(): array { return [ - new TdkCommand(), + new GitCommand(), new HookCommand(), ]; } diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php new file mode 100644 index 0000000..92e550f --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -0,0 +1,159 @@ +gitService = new GitService(); + $this->validationService = new ValidationService($this->getIO(), $this->requireComposer()); + parent::initialize($input, $output); + } + + protected function configure() + { + $this + ->setName('tdk-plugin:git') + ->setDescription('Do some git operations') + ->addArgument('action', InputArgument::OPTIONAL, 'Manage git related files.') + ->addOption('username', 'u', InputOption::VALUE_OPTIONAL, 'Gerrit/TYPO3 account username') + ->addOption('file', 'f', InputOption::VALUE_OPTIONAL, 'Relative path to your git commit template.') + ->addOption('ref', null, InputOption::VALUE_OPTIONAL, 'Relative path to your git commit template.') + ->addOption('branch', null, InputOption::VALUE_OPTIONAL, 'Checkout a certain git branch.') + ->setHelp(<<input = $input; + $this->output = $output; + $action = $input->getArgument('action'); + + switch ($action) { + case 'config': + $this->setConfig(); + break; + case 'template': + $this->setCommitTemplate(); + break; + case 'apply': + $this->applyPatch(); + break; + case 'clone': + $this->cloneRepository(); + break; + case 'checkout': + $this->checkout(); + break; + } + + return Command::SUCCESS; + } + + protected function setConfig() { + $username = $this->input->getOption('username') ?? getenv('TDK_USERNAME') ?? false; + if ($username === 'none') { + return 0; + } + + if ($username) { + $userData = $this->validationService->user()($username); + } else { + $userData = $this->getIO()->askAndValidate('What is your TYPO3/Gerrit Account Username? ', $this->validationService->user(), 3); + } + + $this->gitService->setConfig($userData); + + return Command::SUCCESS; + } + + protected function setCommitTemplate(): int + { + $filePath = $this->input->getOption('file'); + + if ($filePath ?? false) { + $file = $this->validationService->filePath()($filePath); + } else { + $file = $this->getIO()->askAndValidate('Set TYPO3 commit message template [default: .gitmessage.txt]? ', $this->validationService->filePath(), 3, '.gitmessage.txt'); + } + + $status = $this->gitService->setCommitTemplate($file); + + if ($status) { + $this->getIO()->writeError('Could not enable Git Commit Template!'); + return Command::FAILURE; + } + + $template = realpath($file); + $this->getIO()->write('Set "commit.template" to ' . $template . ' '); + + return Command::SUCCESS; + } + + public function applyPatch() { + $ref = $this->input->getOption('ref') ?? getenv('TDK_PATCH_REF') ?? false; + if (empty($ref)) { + $this->getIO()->write('No patch ref given'); + return Command::FAILURE; + } + + if (!$this->gitService->repositoryExists()) { + $this->getIO()->write('Could not apply patch, repository does not exist. Please run "composer tdk:clone"'); + return Command::FAILURE; + } + + if ($this->gitService->applyPatch($ref)) { + $this->getIO()->write('Could not apply patch ' . $ref . ' '); + } + } + + public function cloneRepository(): int + { + if ($this->gitService->repositoryExists()) { + $this->getIO()->writeError('Repository exists! Therefore no download required.'); + return Command::FAILURE; + } + + $this->getIO()->write('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + + $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; + if ($this->gitService->cloneRepository($gitRemoteUrl)) { + $this->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); + return Command::FAILURE; + } + + return Command::SUCCESS; + } + + public function checkout() { + $branch = $this->input->getOption('branch') ?? getenv('TDK_BRANCH') ?? false; + if (empty($branch)) { + $branch = 'main'; + } + + $this->getIO()->write('Checking out branch "' . $branch . '"!'); + if ($this->gitService->checkout($branch)) { + $this->getIO()->write('Could not checkout branch ' . $branch . ' '); + } + } +} diff --git a/packages/tdk-composer-plugin/src/Command/HookCommand.php b/packages/tdk-composer-plugin/src/Command/HookCommand.php index d9248a7..ae93c6b 100644 --- a/packages/tdk-composer-plugin/src/Command/HookCommand.php +++ b/packages/tdk-composer-plugin/src/Command/HookCommand.php @@ -7,6 +7,7 @@ use Composer\Command\BaseCommand; use Ochorocho\TdkComposer\Service\HookService; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -24,7 +25,7 @@ protected function configure() ->setName('tdk-plugin:hooks') ->setDescription('Enable hooks') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to overwrite hooks') - ->addArgument('action', InputOption::VALUE_NONE, 'Create/delete hooks') + ->addArgument('action', InputArgument::OPTIONAL, 'Create/delete hooks') ->setHelp(<<info($hooks); } @@ -77,6 +78,18 @@ protected function execute(InputInterface $input, OutputInterface $output) return $code; } + protected function create(string $file): int + { + try { + $this->hookService->create($file); + $this->output->writeln('Created "' . $file . '" hook'); + return Command::SUCCESS; + } catch (IOException $e) { + $this->output->writeln('Failed to create "' . $file . '" hook:' . $e->getMessage() . ''); + return Command::FAILURE; + } + } + protected function delete(string $file): int { try { @@ -107,16 +120,4 @@ protected function info(array $hooks): int return $code; } - - protected function create(string $file): int - { - try { - $this->hookService->create($file); - $this->output->writeln('Created "' . $file . '" hook'); - return Command::SUCCESS; - } catch (IOException $e) { - $this->output->writeln('Failed to create "' . $file . '" hook:' . $e->getMessage() . ''); - return Command::FAILURE; - } - } } diff --git a/packages/tdk-composer-plugin/src/Command/TdkCommand.php b/packages/tdk-composer-plugin/src/Command/TdkCommand.php deleted file mode 100644 index 7db7d7e..0000000 --- a/packages/tdk-composer-plugin/src/Command/TdkCommand.php +++ /dev/null @@ -1,56 +0,0 @@ -setName('tdk:package') - ->setDescription('Generate a package for Gitlab') - ->setDefinition([ - new InputOption('json', 'j', InputOption::VALUE_REQUIRED, 'Composer json file', 'composer.json'), - ]) - ->setHelp(<<requireComposer(); - $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'package', $input, $output); - $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); - $output->writeln('Hooooray .... '); - } -} diff --git a/packages/tdk-composer-plugin/src/Service/GitService.php b/packages/tdk-composer-plugin/src/Service/GitService.php new file mode 100644 index 0000000..09b9274 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Service/GitService.php @@ -0,0 +1,67 @@ +setGitConfigValue('remote.origin.pushurl', $pushUrl); + $this->setGitConfigValue('user.name', $userData['display_name'] ?? $userData['name'] ?? $userData['username']); + $this->setGitConfigValue('user.email', $userData['email']); + + return Command::SUCCESS; + } + + public function setCommitTemplate(string $filePath): int + { + $process = new ProcessExecutor(); + $template = realpath($filePath); + return $process->execute('git config commit.template ' . $template, $output, $this->coreDevFolder); + } + + private function setGitConfigValue(string $config, string $value): void + { + $process = new ProcessExecutor(); + $command = 'git config ' . $config . ' "' . $value . '"'; + $status = $process->execute($command, $output, $this->coreDevFolder); + if ($status > 0) { + throw new IOException('Could not set Git "' . $config . '" to "' . $value); + } + } + + public function applyPatch($ref) + { + $process = new ProcessExecutor(); + $command = 'git fetch https://review.typo3.org/Packages/TYPO3.CMS ' . $ref . ' && git cherry-pick FETCH_HEAD'; + + return $process->executeTty($command, $this->coreDevFolder); + } + + public function cloneRepository($url): int + { + $process = new ProcessExecutor(); + $command = sprintf('git clone %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($this->coreDevFolder)); + + return $process->executeTty($command); + } + + public function checkout(string $branch) + { + $process = new ProcessExecutor(); + $command = sprintf('git checkout %s', ProcessExecutor::escape($branch)); + return $process->executeTty($command, $this->coreDevFolder); + } + + public function repositoryExists(): bool + { + return $this->filesystem->exists($this->coreDevFolder); + } +} diff --git a/packages/tdk-composer-plugin/src/Service/HookService.php b/packages/tdk-composer-plugin/src/Service/HookService.php index 7d5c88a..a800801 100644 --- a/packages/tdk-composer-plugin/src/Service/HookService.php +++ b/packages/tdk-composer-plugin/src/Service/HookService.php @@ -4,7 +4,6 @@ namespace Ochorocho\TdkComposer\Service; -use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; class HookService extends BaseService diff --git a/packages/tdk-composer-plugin/src/Service/ValidationService.php b/packages/tdk-composer-plugin/src/Service/ValidationService.php index 7dc77ab..39f246b 100644 --- a/packages/tdk-composer-plugin/src/Service/ValidationService.php +++ b/packages/tdk-composer-plugin/src/Service/ValidationService.php @@ -4,16 +4,23 @@ namespace Ochorocho\TdkComposer\Service; +use Composer\Composer; use Composer\Downloader\TransportException; -use Composer\Script\Event; +use Composer\IO\IOInterface; use Composer\Util\HttpDownloader; class ValidationService { - /** - * @return \Closure - */ - public static function projectName(): \Closure + protected IOInterface $io; + protected Composer $composer; + + public function __construct(IOInterface $io, Composer $composer) + { + $this->io = $io; + $this->composer = $composer; + } + + public function projectName(): \Closure { return function ($value) { if (!preg_match('/^[a-zA-Z0-9_-]*$/', trim($value))) { @@ -27,7 +34,7 @@ public static function projectName(): \Closure /** * @return \Closure */ - public static function filePath(): \Closure + public function filePath(): \Closure { return function ($value) { if (!is_file($value)) { @@ -38,36 +45,24 @@ public static function filePath(): \Closure }; } - /** - * @param Event $event - * @return \Closure - */ - public static function username(Event $event): \Closure + public function user(): \Closure { - return function ($value) use ($event) { + return function ($username) { try { - $userData = self::getGerritUserData($event, $value); + $request = new HttpDownloader($this->io, $this->composer->getConfig()); + $json = $request->get('https://review.typo3.org/accounts/' . urlencode($username ?? '') . '/?pp=0'); + + // Gerrit does not return valid JSON using their JSON API + // therefore we need to chop off the first line + // Sounds weird? See why https://gerrit-review.googlesource.com/Documentation/rest-api.html#output + $validJson = str_replace(')]}\'', '', $json->getBody()); + + $userData = json_decode($validJson, true, 512, JSON_THROW_ON_ERROR); } catch (TransportException $exception) { - throw new \UnexpectedValueException('Username "' . $value . '" not found in TYPO3 Gerrit.'); + throw new \UnexpectedValueException('Username "' . $username . '" not found in TYPO3 Gerrit.'); } return $userData; }; } - - /** - * @throws \JsonException - */ - private static function getGerritUserData(Event $event, string $username): array - { - $request = new HttpDownloader($event->getIO(), $event->getComposer()->getConfig()); - $json = $request->get('https://review.typo3.org/accounts/' . urlencode($username) . '/?pp=0'); - - // Gerrit does not return valid JSON using their JSON API - // therefore we need to chop off the first line - // Sounds weird? See why https://gerrit-review.googlesource.com/Documentation/rest-api.html#output - $validJson = str_replace(')]}\'', '', $json->getBody()); - - return json_decode($validJson, true, 512, JSON_THROW_ON_ERROR); - } } From 561d191f41e973de794f6efcc21825b18c5d5e18 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Fri, 16 Sep 2022 20:19:05 +0200 Subject: [PATCH 04/60] [TASK] Migrate validation script to composer plugin --- Scripts/CommonScript.php | 1 + Scripts/MessageScript.php | 38 ---------- Scripts/ValidatorScript.php | 73 ------------------- .../src/Command/GitCommand.php | 9 +++ .../src/Service/BaseService.php | 24 ++++++ .../src/Service/ValidationService.php | 3 - 6 files changed, 34 insertions(+), 114 deletions(-) delete mode 100644 Scripts/MessageScript.php delete mode 100644 Scripts/ValidatorScript.php diff --git a/Scripts/CommonScript.php b/Scripts/CommonScript.php index cb64557..364c98b 100644 --- a/Scripts/CommonScript.php +++ b/Scripts/CommonScript.php @@ -97,6 +97,7 @@ public static function getPhpVersion(string $jsonPath = ''): string return $version; } + // @todo: check after patch applied, because a patch may change the version if ($jsonPath === '') { $jsonPath = self::$coreDevFolder . '/composer.json'; } diff --git a/Scripts/MessageScript.php b/Scripts/MessageScript.php deleted file mode 100644 index bd27453..0000000 --- a/Scripts/MessageScript.php +++ /dev/null @@ -1,38 +0,0 @@ -To be able to push to Gerrit, you need to add your public key, see https://review.typo3.org/settings/#SSHKeys -EOF; - - $event->getIO()->write($summary); - } - - public static function done(Event $event): void - { - $event->getIO()->write('πŸŽ‰ Happy days ... TYPO3 Composer CoreDev Setup done!'); - } -} diff --git a/Scripts/ValidatorScript.php b/Scripts/ValidatorScript.php deleted file mode 100644 index 0cd11f7..0000000 --- a/Scripts/ValidatorScript.php +++ /dev/null @@ -1,73 +0,0 @@ -getIO(), $event->getComposer()->getConfig()); - $json = $request->get('https://review.typo3.org/accounts/' . urlencode($username) . '/?pp=0'); - - // Gerrit does not return valid JSON using their JSON API - // therefore we need to chop off the first line - // Sounds weird? See why https://gerrit-review.googlesource.com/Documentation/rest-api.html#output - $validJson = str_replace(')]}\'', '', $json->getBody()); - - return json_decode($validJson, true, 512, JSON_THROW_ON_ERROR); - } -} diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index 92e550f..2b8350f 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -8,6 +8,8 @@ use Ochorocho\TdkComposer\Service\GitService; use Ochorocho\TdkComposer\Service\ValidationService; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -156,4 +158,11 @@ public function checkout() { $this->getIO()->write('Could not checkout branch ' . $branch . ' '); } } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestOptionValuesFor('action')) { + $suggestions->suggestValues(['config', 'template', 'apply', 'clone', 'checkout']); + } + } } diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php index 878639b..4e2034e 100644 --- a/packages/tdk-composer-plugin/src/Service/BaseService.php +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -15,4 +15,28 @@ public function __construct() { $this->filesystem = new Filesystem(); } + + public function summary(): string + { + $coreFolder = $this->coreDevFolder; + return <<To be able to push to Gerrit, you need to add your public key, see https://review.typo3.org/settings/#SSHKeys +EOF; + } + + public function done(): string + { + return 'πŸŽ‰ Happy days ... TYPO3 Composer CoreDev Setup done!'; + } } diff --git a/packages/tdk-composer-plugin/src/Service/ValidationService.php b/packages/tdk-composer-plugin/src/Service/ValidationService.php index 39f246b..9bc816e 100644 --- a/packages/tdk-composer-plugin/src/Service/ValidationService.php +++ b/packages/tdk-composer-plugin/src/Service/ValidationService.php @@ -31,9 +31,6 @@ public function projectName(): \Closure }; } - /** - * @return \Closure - */ public function filePath(): \Closure { return function ($value) { From c2897188eb74a390ad30a4ce46d322258de42a89 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Fri, 16 Sep 2022 21:24:52 +0200 Subject: [PATCH 05/60] [TASK] Migrate doctor command to composer plugin --- .../src/Command/CommandProvider.php | 1 + .../src/Command/DoctorCommand.php | 94 +++++++++++++++++++ .../src/Command/GitCommand.php | 2 +- .../src/Service/BaseService.php | 7 +- .../src/Service/GitService.php | 21 +++-- .../src/Service/HookService.php | 8 +- 6 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 packages/tdk-composer-plugin/src/Command/DoctorCommand.php diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index aad3c0d..a1caf00 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -14,6 +14,7 @@ public function getCommands(): array return [ new GitCommand(), new HookCommand(), + new DoctorCommand(), ]; } } diff --git a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php new file mode 100644 index 0000000..f050511 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php @@ -0,0 +1,94 @@ +setName('tdk-plugin:doctor') + ->setDescription('Test TYPO3 Development Kit setup') + ->setHelp(<<exists($coreDevFolder . '/.git')) { + $gitService = new GitService(); + $commit = $gitService->latestCommit(); + $this->getIO()->write($iconSuccess . 'Repository exists on commit ' . $commit); + } else { + $this->getIO()->write($iconFailed . 'Repository not in place, please run "composer tdk:git clone"'); + $code = Command::FAILURE; + } + + // Test if hooks are set up + if ($filesystem->exists([ + $coreDevFolder . '/.git/hooks/pre-commit', + $coreDevFolder . '/.git/hooks/commit-msg', + ])) { + $this->getIO()->write($iconSuccess . 'All hooks are in place.'); + } else { + $this->getIO()->write($iconFailed . 'Hooks are missing please run "composer tdk:hooks create".'); + $code = Command::FAILURE; + } + + // Test git push url + $process = new ProcessExecutor(); + $command = 'git config --get remote.origin.pushurl'; + $process->execute($command, $commandOutput, $coreDevFolder); + + preg_match('/^ssh:\/\/(.*)@review\.typo3\.org/', (string)$commandOutput, $matches); + if (!empty($matches)) { + $this->getIO()->write($iconSuccess . 'Git "remote.origin.pushurl" seems correct.'); + } else { + $this->getIO()->write($iconFailed . 'Git "remote.origin.pushurl" not set correctly, please run "composer tdk:git config".'); + $code = Command::FAILURE; + } + + // Test commit template + $commandTemplate = 'git config --get commit.template'; + $process->execute($commandTemplate, $outputTemplate, $coreDevFolder); + + if (!empty($outputTemplate) && $filesystem->exists(trim($outputTemplate))) { + $this->getIO()->write($iconSuccess . 'Git "commit.template" is set to ' . trim($outputTemplate) . '.'); + } else { + $this->getIO()->write($iconFailed . 'Git "commit.template" not set or file does not exist, please run "composer tdk:git template"'); + $code = Command::FAILURE; + } + + // Test vendor folder + if ($filesystem->exists('vendor')) { + $this->getIO()->write($iconSuccess . 'Vendor folder exists.'); + } else { + $this->getIO()->write($iconFailed . 'Vendor folder is missing, please run "composer install"'); + $code = Command::FAILURE; + } + + return $code; + } +} diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index 2b8350f..cc355a6 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -75,7 +75,7 @@ protected function execute(InputInterface $input, OutputInterface $output) protected function setConfig() { $username = $this->input->getOption('username') ?? getenv('TDK_USERNAME') ?? false; if ($username === 'none') { - return 0; + return Command::SUCCESS; } if ($username) { diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php index 4e2034e..251acc9 100644 --- a/packages/tdk-composer-plugin/src/Service/BaseService.php +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -8,8 +8,11 @@ abstract class BaseService { + public const CORE_DEV_FOLDER = 'typo3-core'; + public const ICON_SUCCESS = 'βœ” '; + public const ICON_FAILED = '✘ '; + protected Filesystem $filesystem; - protected string $coreDevFolder = 'typo3-core'; public function __construct() { @@ -18,7 +21,7 @@ public function __construct() public function summary(): string { - $coreFolder = $this->coreDevFolder; + $coreFolder = self::CORE_DEV_FOLDER; return <<execute('git config commit.template ' . $template, $output, $this->coreDevFolder); + return $process->execute('git config commit.template ' . $template, $output, BaseService::CORE_DEV_FOLDER); } private function setGitConfigValue(string $config, string $value): void { $process = new ProcessExecutor(); $command = 'git config ' . $config . ' "' . $value . '"'; - $status = $process->execute($command, $output, $this->coreDevFolder); + $status = $process->execute($command, $output, BaseService::CORE_DEV_FOLDER); if ($status > 0) { throw new IOException('Could not set Git "' . $config . '" to "' . $value); } @@ -42,13 +42,13 @@ public function applyPatch($ref) $process = new ProcessExecutor(); $command = 'git fetch https://review.typo3.org/Packages/TYPO3.CMS ' . $ref . ' && git cherry-pick FETCH_HEAD'; - return $process->executeTty($command, $this->coreDevFolder); + return $process->executeTty($command, BaseService::CORE_DEV_FOLDER); } public function cloneRepository($url): int { $process = new ProcessExecutor(); - $command = sprintf('git clone %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($this->coreDevFolder)); + $command = sprintf('git clone %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape(BaseService::CORE_DEV_FOLDER)); return $process->executeTty($command); } @@ -57,11 +57,20 @@ public function checkout(string $branch) { $process = new ProcessExecutor(); $command = sprintf('git checkout %s', ProcessExecutor::escape($branch)); - return $process->executeTty($command, $this->coreDevFolder); + return $process->executeTty($command, BaseService::CORE_DEV_FOLDER); } public function repositoryExists(): bool { - return $this->filesystem->exists($this->coreDevFolder); + return $this->filesystem->exists(BaseService::CORE_DEV_FOLDER); + } + + public function latestCommit(): string + { + $process = new ProcessExecutor(); + $command = 'git log -n 1 --pretty=\'format:%C(auto)%h (%s, %ad)\''; + $process->execute($command, $output, BaseService::CORE_DEV_FOLDER); + + return $output; } } diff --git a/packages/tdk-composer-plugin/src/Service/HookService.php b/packages/tdk-composer-plugin/src/Service/HookService.php index a800801..ed1c779 100644 --- a/packages/tdk-composer-plugin/src/Service/HookService.php +++ b/packages/tdk-composer-plugin/src/Service/HookService.php @@ -11,7 +11,7 @@ class HookService extends BaseService public function delete(array $files): void { $filePaths = array_map(function ($value) { - return $this->coreDevFolder . '/.git/hooks/' . $value; + return BaseService::CORE_DEV_FOLDER . '/.git/hooks/' . $value; }, $files); $this->filesystem->remove($filePaths); @@ -20,8 +20,8 @@ public function delete(array $files): void public function create(string $fileName): void { $finder = new Finder(); - $hookTarget = $this->coreDevFolder . '/.git/hooks/' . $fileName; - $files = $finder->name($fileName)->in($this->coreDevFolder . '/Build/git-hooks/')->files(); + $hookTarget = BaseService::CORE_DEV_FOLDER . '/.git/hooks/' . $fileName; + $files = $finder->name($fileName)->in(BaseService::CORE_DEV_FOLDER . '/Build/git-hooks/')->files(); foreach ($files as $file) { $this->filesystem->copy($file->getPath() . '/' . $file->getFilename(), $hookTarget); } @@ -33,7 +33,7 @@ public function create(string $fileName): void public function exists($hook): bool { - $hookTarget = $this->coreDevFolder . '/.git/hooks/' . $hook; + $hookTarget = BaseService::CORE_DEV_FOLDER . '/.git/hooks/' . $hook; return $this->filesystem->exists($hookTarget); } } From ac060065d48c5049b7ad86351d059bceb360513f Mon Sep 17 00:00:00 2001 From: ochorocho Date: Fri, 16 Sep 2022 21:58:53 +0200 Subject: [PATCH 06/60] [TASK] Migrate cleanup command to composer plugin --- .gitpod/php/version.php | 11 ++-- Scripts/BaseScript.php | 23 ------- .../src/Command/CleanupCommand.php | 60 +++++++++++++++++++ .../src/Command/CommandProvider.php | 1 + .../src/Service/BaseService.php | 21 +++++++ 5 files changed, 89 insertions(+), 27 deletions(-) delete mode 100644 Scripts/BaseScript.php create mode 100644 packages/tdk-composer-plugin/src/Command/CleanupCommand.php diff --git a/.gitpod/php/version.php b/.gitpod/php/version.php index 80e4768..d244399 100644 --- a/.gitpod/php/version.php +++ b/.gitpod/php/version.php @@ -1,9 +1,12 @@ setName('tdk-plugin:cleanup') + ->setDescription('Delete TYPO3 installation in this TDK (files and folders only)') + ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to run delete without confirmation') + ->setHelp(<<getOption('force'); + + if ($force) { + $answer = true; + } else { + $answer = $this->getIO()->askConfirmation('Really want to delete ' . implode(', ', $filesToDelete) . '? [y/n] ', false); + } + + if ($answer) { + $filesystem = new Filesystem(); + $filesystem->remove($filesToDelete); + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Done deleting files.'); + } + + return Command::SUCCESS; + } +} diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index a1caf00..945a77b 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -15,6 +15,7 @@ public function getCommands(): array new GitCommand(), new HookCommand(), new DoctorCommand(), + new CleanupCommand(), ]; } } diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php index 251acc9..94c5d79 100644 --- a/packages/tdk-composer-plugin/src/Service/BaseService.php +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -42,4 +42,25 @@ public function done(): string { return 'πŸŽ‰ Happy days ... TYPO3 Composer CoreDev Setup done!'; } + + public static function getPhpVersion(string $jsonPath = ''): string + { + if ($version = getenv('TDK_PHP_VERSION')) { + return $version; + } + + // @todo: check after patch applied, because a patch may change the version + if ($jsonPath === '') { + $jsonPath = self::CORE_DEV_FOLDER . '/composer.json'; + } + + if ($fileContent = file_get_contents($jsonPath)) { + $json = json_decode($fileContent, true, 512, JSON_THROW_ON_ERROR); + preg_match_all('/[0-9].[0-9]/', $json['require']['php'], $versions); + + return trim($versions[0][0]); + } + + return '8.2'; + } } From 88e9f537c7a90d84c17cdd5235853e389e2de85b Mon Sep 17 00:00:00 2001 From: ochorocho Date: Fri, 16 Sep 2022 23:54:38 +0200 Subject: [PATCH 07/60] [TASK] Put plugin commands in place, migrate ddev config command to composer --- .gitpod/php/version.php | 6 +- Scripts/CommonScript.php | 164 ------------------ .../src/Command/CleanupCommand.php | 2 +- .../src/Command/CommandProvider.php | 1 + .../src/Command/DdevConfigCommand.php | 80 +++++++++ .../src/Command/DoctorCommand.php | 2 +- .../src/Command/GitCommand.php | 2 +- .../src/Command/HookCommand.php | 9 +- .../src/Service/BaseService.php | 8 +- tests/Acceptance/TdkCest.php | 22 +-- 10 files changed, 106 insertions(+), 190 deletions(-) delete mode 100644 Scripts/CommonScript.php create mode 100644 packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php diff --git a/.gitpod/php/version.php b/.gitpod/php/version.php index d244399..db94846 100644 --- a/.gitpod/php/version.php +++ b/.gitpod/php/version.php @@ -5,8 +5,4 @@ $branch = getenv('TDK_BRANCH') ?: 'main'; $composerFile = 'https://raw.githubusercontent.com/TYPO3/typo3/' . $branch . '/composer.json'; -try { - echo BaseService::getPhpVersion($composerFile) . PHP_EOL; -} catch (JsonException $e) { - echo '8.1' . PHP_EOL; -} \ No newline at end of file +echo BaseService::getPhpVersion($composerFile) . PHP_EOL; \ No newline at end of file diff --git a/Scripts/CommonScript.php b/Scripts/CommonScript.php deleted file mode 100644 index 364c98b..0000000 --- a/Scripts/CommonScript.php +++ /dev/null @@ -1,164 +0,0 @@ -getArguments())['project-name'] ?? getenv('TDK_CREATE_DDEV_PROJECT_NAME') ?? false; - if (!$ddevProjectName) { - $skip = isset(self::getArguments($event->getArguments())['no']) ?? false; - if ($skip) { - $createConfig = false; - } else { - $createConfig = $event->getIO()->askConfirmation('Create a basic ddev config [y/n] ?'); - } - - if (!$createConfig) { - $event->getIO()->write('Aborted! No ddev config created.'); - return 0; - } - } - - $validator = ValidatorScript::projectName(); - - if (!$ddevProjectName) { - $defaultProjectName = basename(getcwd()); - $ddevProjectName = $event->getIO()->askAndValidate('Choose a ddev project name [default: ' . $defaultProjectName . '] :', $validator, 2, $defaultProjectName); - } else { - try { - $ddevProjectName = $validator($ddevProjectName); - } catch (\UnexpectedValueException $e) { - $event->getIO()->write('' . $e->getMessage() . ''); - return 1; - } - } - - $phpVersion = self::getPhpVersion(); - $ddevCommand = 'ddev config --docroot public --project-name ' . $ddevProjectName . ' --web-environment-add TYPO3_CONTEXT=Development --project-type typo3 --php-version ' . $phpVersion . ' --create-docroot 1> /dev/null'; - exec($ddevCommand, $output, $statusCode); - - return $statusCode; - } - - return 0; - } - - public static function removeFilesAndFolders(Event $event): void - { - $filesToDelete = [ - 'composer.lock', - 'public/index.php', - 'public/typo3', - self::$coreDevFolder, - 'var', - ]; - - $force = self::getArguments($event->getArguments())['force'] ?? false; - - if ($force) { - $answer = true; - } else { - $answer = $event->getIO()->askConfirmation('Really want to delete ' . implode(', ', $filesToDelete) . '? [y/n] ', false); - } - - if ($answer) { - $filesystem = new Filesystem(); - $filesystem->remove($filesToDelete); - $event->getIO()->write('Done deleting files.'); - } - } - - /** - * Determine php version: - * 1. From env (TDK_PHP_VERSION) - * 2. composer.json of current branch - * 3. Default: 8.1 - * - * @param string $jsonPath - * @return string - * @throws \JsonException - */ - public static function getPhpVersion(string $jsonPath = ''): string - { - if ($version = getenv('TDK_PHP_VERSION')) { - return $version; - } - - // @todo: check after patch applied, because a patch may change the version - if ($jsonPath === '') { - $jsonPath = self::$coreDevFolder . '/composer.json'; - } - - if ($fileContent = file_get_contents($jsonPath)) { - $json = json_decode($fileContent, true, 512, JSON_THROW_ON_ERROR); - preg_match_all('/[0-9].[0-9]/', $json['require']['php'], $versions); - return $versions[0][0]; - } - - return '8.1'; - } - - public static function doctor(Event $event): void - { - $filesystem = new Filesystem(); - - // Test for existing repository - if ($filesystem->exists(self::$coreDevFolder . '/.git')) { - $event->getIO()->write('βœ” Repository exists.'); - } else { - $event->getIO()->write('✘ TYPO3 Repository not in place, please run "composer tdk:clone"'); - } - - // Test if hooks are set up - if ($filesystem->exists([ - self::$coreDevFolder . '/.git/hooks/pre-commit', - self::$coreDevFolder . '/.git/hooks/commit-msg', - ])) { - $event->getIO()->write('βœ” All hooks are in place.'); - } else { - $event->getIO()->write('✘ Hooks are missing please run "composer tdk:enable-hooks".'); - } - - // Test git push url - $process = new ProcessExecutor(); - $command = 'git config --get remote.origin.pushurl'; - $process->execute($command, $output, self::$coreDevFolder); - - preg_match('/^ssh:\/\/(.*)@review\.typo3\.org/', $output, $matches); - if (!empty($matches)) { - $event->getIO()->write('βœ” Git "remote.origin.pushurl" seems correct.'); - } else { - $event->getIO()->write('✘ Git "remote.origin.pushurl" not set correctly, please run "composer tdk:set-git-config".'); - } - - // Test commit template - $commandTemplate = 'git config --get commit.template'; - $process->execute($commandTemplate, $outputTemplate, self::$coreDevFolder); - - if (!empty($outputTemplate) && $filesystem->exists(trim($outputTemplate))) { - $event->getIO()->write('βœ” Git "commit.template" is set to ' . trim($outputTemplate) . '.'); - } else { - $event->getIO()->write('✘ Git "commit.template" not set or file does not exist, please run "composer tdk:set-commit-template"'); - } - - // Test vendor folder - if ($filesystem->exists('vendor')) { - $event->getIO()->write('βœ” Vendor folder exists.'); - } else { - $event->getIO()->write('✘ Vendor folder is missing, please run "composer install"'); - } - } -} diff --git a/packages/tdk-composer-plugin/src/Command/CleanupCommand.php b/packages/tdk-composer-plugin/src/Command/CleanupCommand.php index b78c32e..d0749d2 100644 --- a/packages/tdk-composer-plugin/src/Command/CleanupCommand.php +++ b/packages/tdk-composer-plugin/src/Command/CleanupCommand.php @@ -22,7 +22,7 @@ final class CleanupCommand extends BaseCommand protected function configure() { $this - ->setName('tdk-plugin:cleanup') + ->setName('tdk:cleanup') ->setDescription('Delete TYPO3 installation in this TDK (files and folders only)') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to run delete without confirmation') ->setHelp(<<setName('tdk:ddev') + ->setDescription('Delete TYPO3 installation in this TDK (files and folders only)') + ->addOption('project-name', null, InputOption::VALUE_OPTIONAL, 'Set project name') + ->addOption('no', null, InputOption::VALUE_NONE, 'Set all to no') + ->setHelp(<<getOption('project-name') ?? getenv('TDK_CREATE_DDEV_PROJECT_NAME') ?? false; + if (!$ddevProjectName) { + $skip = $input->getOption('no') ?? false; + if ($skip) { + $createConfig = false; + } else { + $createConfig = $this->getIO()->askConfirmation('Create a basic ddev config [y/n]? '); + } + + if (!$createConfig) { + $this->getIO()->write('Aborted! No ddev config created.'); + return Command::SUCCESS; + } + } + + $validationService = new ValidationService($this->getIO(), $this->requireComposer()); + $validator = $validationService->projectName(); + + if (!$ddevProjectName) { + $defaultProjectName = basename(getcwd()); + $ddevProjectName = $this->getIO()->askAndValidate('Choose a ddev project name [default: ' . $defaultProjectName . '] :', $validator, 2, $defaultProjectName); + } else { + try { + $ddevProjectName = $validator($ddevProjectName); + } catch (\UnexpectedValueException $e) { + $this->getIO()->write('' . $e->getMessage() . ''); + return Command::FAILURE; + } + } + + $phpVersion = BaseService::getPhpVersion(); + $ddevCommand = 'ddev config --docroot public --project-name ' . $ddevProjectName . ' --web-environment-add TYPO3_CONTEXT=Development --project-type typo3 --php-version ' . $phpVersion . ' --create-docroot 1> /dev/null'; + + return (new ProcessExecutor())->execute($ddevCommand, $output); + } + + $this->getIO()->write('No ddev binary found.'); + + return Command::SUCCESS; + } +} diff --git a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php index f050511..54c6f2d 100644 --- a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php @@ -20,7 +20,7 @@ final class DoctorCommand extends BaseCommand protected function configure() { $this - ->setName('tdk-plugin:doctor') + ->setName('tdk:doctor') ->setDescription('Test TYPO3 Development Kit setup') ->setHelp(<<setName('tdk-plugin:git') + ->setName('tdk:git') ->setDescription('Do some git operations') ->addArgument('action', InputArgument::OPTIONAL, 'Manage git related files.') ->addOption('username', 'u', InputOption::VALUE_OPTIONAL, 'Gerrit/TYPO3 account username') diff --git a/packages/tdk-composer-plugin/src/Command/HookCommand.php b/packages/tdk-composer-plugin/src/Command/HookCommand.php index ae93c6b..088fec8 100644 --- a/packages/tdk-composer-plugin/src/Command/HookCommand.php +++ b/packages/tdk-composer-plugin/src/Command/HookCommand.php @@ -5,6 +5,7 @@ namespace Ochorocho\TdkComposer\Command; use Composer\Command\BaseCommand; +use Ochorocho\TdkComposer\Service\BaseService; use Ochorocho\TdkComposer\Service\HookService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -22,7 +23,7 @@ final class HookCommand extends BaseCommand protected function configure() { $this - ->setName('tdk-plugin:hooks') + ->setName('tdk:hooks') ->setDescription('Enable hooks') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to overwrite hooks') ->addArgument('action', InputArgument::OPTIONAL, 'Create/delete hooks') @@ -107,15 +108,15 @@ protected function info(array $hooks): int $code = Command::SUCCESS; foreach ($hooks as $file) { if ($this->hookService->exists($file)) { - $this->output->writeln('βœ… Hook "' . $file . '" exists'); + $this->output->writeln('' . BaseService::ICON_SUCCESS . 'Hook "' . $file . '" exists'); } else { - $this->output->writeln('❌ Hook "' . $file . '" does not exist'); + $this->output->writeln(BaseService::ICON_FAILED . 'Hook "' . $file . '" does not exist'); $code = Command::FAILURE; } } if ($code !== Command::SUCCESS) { - $this->output->writeln('You may run "composer tdk-plugin:hooks create"'); + $this->output->writeln('You may run "composer tdk:hooks create"'); } return $code; diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php index 94c5d79..3ca12f8 100644 --- a/packages/tdk-composer-plugin/src/Service/BaseService.php +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -54,13 +54,15 @@ public static function getPhpVersion(string $jsonPath = ''): string $jsonPath = self::CORE_DEV_FOLDER . '/composer.json'; } - if ($fileContent = file_get_contents($jsonPath)) { + try { + $fileContent = file_get_contents($jsonPath); $json = json_decode($fileContent, true, 512, JSON_THROW_ON_ERROR); preg_match_all('/[0-9].[0-9]/', $json['require']['php'], $versions); return trim($versions[0][0]); - } - return '8.2'; + } catch (\Exception $exception) { + return '8.1'; + } } } diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index d418e6c..edcca60 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -24,7 +24,7 @@ public function clone(AcceptanceTester $I): void $I->seeInShellOutput('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); $I->seeInShellOutput('Cloning into'); - $I->runShellCommand('composer tdk:clone'); + $I->runShellCommand('composer tdk:git clone'); $I->seeResultCodeIs(0); $I->seeInShellOutput('Repository exists! Therefore no download required.'); } @@ -42,7 +42,7 @@ public function help(AcceptanceTester $I): void */ public function gitConfig(AcceptanceTester $I): void { - $I->runShellCommand('composer tdk:set-git-config -- --username=ochorocho'); + $I->runShellCommand('composer tdk:git config --username=ochorocho'); $I->amGoingTo('See expected response text of command'); $I->seeInShellOutput('Set "remote.origin.pushurl" to "ssh://ochorocho@review.typo3.org:29418/Packages/TYPO3.CMS.git"'); $I->seeInShellOutput('Set "user.email" to "rothjochen@gmail.com"'); @@ -66,7 +66,7 @@ public function gitConfig(AcceptanceTester $I): void */ public function commitTemplate(AcceptanceTester $I): void { - $I->runShellCommand('composer tdk:set-commit-template -- --file=./.gitmessage.txt'); + $I->runShellCommand('composer tdk:git template --file=./.gitmessage.txt'); $I->seeInShellOutput('Set "commit.template" to '); $I->runShellCommand('git -C ' . self::$coreDevFolder . ' config --get commit.template'); @@ -81,7 +81,7 @@ public function enableHooks(AcceptanceTester $I): void $hooksFolder = self::$testFolder . self::$coreDevFolder . '.git/hooks/'; $I->amGoingTo('Enable the hooks'); - $I->runShellCommand('composer tdk-plugin:hooks create --force'); + $I->runShellCommand('composer tdk:hooks create --force'); $I->seeResultCodeIs(0); $I->seeFileFound('commit-msg', $hooksFolder); @@ -96,7 +96,7 @@ public function enableHooks(AcceptanceTester $I): void public function applyPatch(AcceptanceTester $I): void { // @todo: Create a dedicated patch to test against, currently this breaks as soon as the patch gets merged - $I->runShellCommand('composer tdk:apply-patch -- --ref=refs/changes/60/69360/6'); + $I->runShellCommand('composer tdk:git apply --ref=refs/changes/60/69360/6'); $I->seeInShellOutput('Apply patch refs/changes/60/69360/6'); $I->runShellCommand('git -C ' . self::$coreDevFolder . ' log -1 --oneline'); @@ -109,17 +109,17 @@ public function applyPatch(AcceptanceTester $I): void public function ddevConfig(AcceptanceTester $I): void { $I->amGoingTo('use a invalid project name'); - $I->runShellCommand('composer tdk:ddev-config -- --project-name="typo3 invalid"'); + $I->runShellCommand('composer tdk:ddev --project-name="typo3 invalid"'); $I->seeInShellOutput('Invalid ddev project name'); $I->dontSeeFileFound('.ddev', 'test-acceptance-tdk/'); $I->amGoingTo('abort configuration'); - $I->runShellCommand('composer tdk:ddev-config -- --no'); + $I->runShellCommand('composer tdk:ddev --no'); $I->seeInShellOutput('Aborted! No ddev config created'); $I->dontSeeFileFound('.ddev', 'test-acceptance-tdk/'); $I->amGoingTo('create a ddev config'); - $I->runShellCommand('composer tdk:ddev-config -- --project-name="typo3-dev-tdk"'); + $I->runShellCommand('composer tdk:ddev --project-name="typo3-dev-tdk"'); $I->seeFileFound('config.yaml', 'test-acceptance-tdk/.ddev/'); $I->seeResultCodeIs(0); } @@ -129,7 +129,7 @@ public function ddevConfig(AcceptanceTester $I): void */ public function checkoutBranch(AcceptanceTester $I): void { - $I->runShellCommand('composer tdk:checkout -- --branch=main'); + $I->runShellCommand('composer tdk:git checkout --branch=main'); $I->seeInShellOutput('Checking out branch "main"!'); $I->runShellCommand('git -C ' . self::$coreDevFolder . ' branch --show-current'); @@ -166,7 +166,7 @@ public function removeHooks(AcceptanceTester $I) $hooksFolder = self::$testFolder . self::$coreDevFolder . '.git/hooks/'; $I->amGoingTo('Delete the hooks'); - $I->runShellCommand('composer tdk-plugin:hooks delete --force'); + $I->runShellCommand('composer tdk:hooks delete --force'); $I->seeResultCodeIs(0); $I->dontSeeFileFound('commit-msg', $hooksFolder); @@ -178,7 +178,7 @@ public function removeHooks(AcceptanceTester $I) */ public function clear(AcceptanceTester $I): void { - $I->runShellCommand('composer tdk:clear -- --force'); + $I->runShellCommand('composer tdk:cleanup --force'); $I->seeResultCodeIs(0); // Foreach is needed here, as we don't want to From a00af5f3d82ca009479b8d3986dc17be5af02cf1 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 00:39:19 +0200 Subject: [PATCH 08/60] [TASK] Change tests to work with the new composer plugin --- .github/workflows/test.yml | 2 +- .php_cs.php | 2 +- .phpstan.neon | 2 +- composer.json | 33 +++--------- .../src/Command/CleanupCommand.php | 7 ++- .../src/Command/CommandProvider.php | 3 +- .../src/Command/DdevConfigCommand.php | 9 ++-- .../src/Command/DoctorCommand.php | 3 +- .../src/Command/GitCommand.php | 43 ++++++++++++--- .../src/Command/HookCommand.php | 3 +- packages/tdk-composer-plugin/src/Plugin.php | 54 +++++++++++++++++-- .../src/Service/BaseService.php | 1 - .../src/Service/ComposerService.php | 20 +++++++ .../src/Service/GitService.php | 12 +---- tests/Acceptance/TdkCest.php | 31 +++++------ 15 files changed, 143 insertions(+), 82 deletions(-) create mode 100644 packages/tdk-composer-plugin/src/Service/ComposerService.php diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 31bbd67..fd5faba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies # Do a clone here to make sure the repository exists on install # to avoid missing repository error in composer. - run: composer tdk:clone && composer install --no-progress + run: composer install --no-progress - name: phpstan run: ./vendor/bin/phpstan analyse -c .phpstan.neon --no-progress diff --git a/.php_cs.php b/.php_cs.php index b0af6d4..22d5f0e 100644 --- a/.php_cs.php +++ b/.php_cs.php @@ -1,5 +1,5 @@ getFinder()->in([__DIR__ . '/Scripts', __DIR__ . '/tests/Acceptance']); +$config->getFinder()->in([__DIR__ . '/packages/tdk-composer-plugin', __DIR__ . '/tests/Acceptance']); return $config; diff --git a/.phpstan.neon b/.phpstan.neon index fa75e28..d39bb5d 100644 --- a/.phpstan.neon +++ b/.phpstan.neon @@ -1,4 +1,4 @@ parameters: level: 3 paths: - - Scripts + - packages/tdk-composer-plugin diff --git a/composer.json b/composer.json index 829b711..4a475e2 100644 --- a/composer.json +++ b/composer.json @@ -10,46 +10,25 @@ } ], "scripts": { - "pre-install-cmd": "@tdk:clone", "post-root-package-install": "@tdk:setup", "post-create-project-cmd": [ "@tdk:help", "Ochorocho\\Tdk\\Scripts\\MessageScript::done" ], "tdk:setup": [ - "@tdk:clone", - "@tdk:set-git-config", - "@tdk:enable-hooks", - "@tdk:ddev-config", - "@tdk:set-commit-template" - ], - "tdk:clone": "Ochorocho\\Tdk\\Scripts\\GitScript::cloneRepository", - "tdk:clear": "Ochorocho\\Tdk\\Scripts\\CommonScript::removeFilesAndFolders", - "tdk:doctor": "Ochorocho\\Tdk\\Scripts\\CommonScript::doctor", - "tdk:remove-hooks": "Ochorocho\\Tdk\\Scripts\\HookScript::remove", - "tdk:enable-hooks": "Ochorocho\\Tdk\\Scripts\\HookScript::enable", - "tdk:ddev-config": "Ochorocho\\Tdk\\Scripts\\CommonScript::createDdevConfig", - "tdk:help": "Ochorocho\\Tdk\\Scripts\\MessageScript::summary", - "tdk:set-commit-template": "Ochorocho\\Tdk\\Scripts\\GitScript::setCommitTemplate", - "tdk:set-git-config": "Ochorocho\\Tdk\\Scripts\\GitScript::setGitConfig", - "tdk:apply-patch": "Ochorocho\\Tdk\\Scripts\\GitScript::applyPatch", - "tdk:checkout": "Ochorocho\\Tdk\\Scripts\\GitScript::checkoutBranch" + "composer tdk:git clone", + "composer tdk:git config", + "composer tdk:hooks create", + "composer tdk:ddev-config", + "composer tdk:git template" + ] }, "repositories": { - "typo3-core-packages": { - "type": "path", - "url": "typo3-core/typo3/sysext/*" - }, "local-packages": { "type": "path", "url": "packages/*" } }, - "autoload-dev": { - "psr-4": { - "Ochorocho\\Tdk\\Scripts\\": "Scripts/" - } - }, "require": { "ext-json": "*", "typo3/cms-adminpanel": "@dev", diff --git a/packages/tdk-composer-plugin/src/Command/CleanupCommand.php b/packages/tdk-composer-plugin/src/Command/CleanupCommand.php index d0749d2..8b12c84 100644 --- a/packages/tdk-composer-plugin/src/Command/CleanupCommand.php +++ b/packages/tdk-composer-plugin/src/Command/CleanupCommand.php @@ -5,10 +5,7 @@ namespace Ochorocho\TdkComposer\Command; use Composer\Command\BaseCommand; -use Composer\Script\Event; -use Composer\Util\ProcessExecutor; use Ochorocho\TdkComposer\Service\BaseService; -use Ochorocho\TdkComposer\Service\GitService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -25,7 +22,8 @@ protected function configure() ->setName('tdk:cleanup') ->setDescription('Delete TYPO3 installation in this TDK (files and folders only)') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to run delete without confirmation') - ->setHelp(<<setHelp( + <<getOption('force'); diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index 0c93393..d73e390 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -6,8 +6,7 @@ use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; -final class CommandProvider - implements CommandProviderCapability +final class CommandProvider implements CommandProviderCapability { public function getCommands(): array { diff --git a/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php b/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php index 2cd2cb7..cca7a41 100644 --- a/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php @@ -24,7 +24,8 @@ protected function configure() ->setDescription('Delete TYPO3 installation in this TDK (files and folders only)') ->addOption('project-name', null, InputOption::VALUE_OPTIONAL, 'Set project name') ->addOption('no', null, InputOption::VALUE_NONE, 'Set all to no') - ->setHelp(<<setHelp( + << /dev/null'; - - return (new ProcessExecutor())->execute($ddevCommand, $output); + $ddevCommand = 'ddev config --docroot public --database mariadb:10.3 --project-name ' . $ddevProjectName . ' --web-environment-add TYPO3_CONTEXT=Development --project-type typo3 --php-version ' . $phpVersion . ' --create-docroot'; + $this->getIO()->write($ddevCommand); + return (new ProcessExecutor())->executeTty($ddevCommand); } $this->getIO()->write('No ddev binary found.'); diff --git a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php index 54c6f2d..17b61c4 100644 --- a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php @@ -22,7 +22,8 @@ protected function configure() $this ->setName('tdk:doctor') ->setDescription('Test TYPO3 Development Kit setup') - ->setHelp(<<setHelp( + <<addOption('file', 'f', InputOption::VALUE_OPTIONAL, 'Relative path to your git commit template.') ->addOption('ref', null, InputOption::VALUE_OPTIONAL, 'Relative path to your git commit template.') ->addOption('branch', null, InputOption::VALUE_OPTIONAL, 'Checkout a certain git branch.') - ->setHelp(<<setHelp( + <<input->getOption('username') ?? getenv('TDK_USERNAME') ?? false; if ($username === 'none') { return Command::SUCCESS; @@ -84,9 +87,27 @@ protected function setConfig() { $userData = $this->getIO()->askAndValidate('What is your TYPO3/Gerrit Account Username? ', $this->validationService->user(), 3); } - $this->gitService->setConfig($userData); + $pushUrl = 'ssh://' . $userData['username'] . '@review.typo3.org:29418/Packages/TYPO3.CMS.git'; - return Command::SUCCESS; + $gitConfigValues = [ + 'remote.origin.pushurl' => $pushUrl, + 'user.name' => $userData['display_name'] ?? $userData['name'] ?? $userData['username'], + 'user.email' => $userData['email'], + ]; + + $code = Command::SUCCESS; + + foreach ($gitConfigValues as $key => $value) { + try { + $this->gitService->setGitConfigValue($key, $value); + $this->getIO()->write('Set "' . $key . '" to "' . $value . '"'); + } catch (IOException $exception) { + $this->getIO()->writeError('' .$exception->getMessage() . '"'); + $code = Command::FAILURE; + } + } + + return $code; } protected function setCommitTemplate(): int @@ -112,7 +133,8 @@ protected function setCommitTemplate(): int return Command::SUCCESS; } - public function applyPatch() { + public function applyPatch() + { $ref = $this->input->getOption('ref') ?? getenv('TDK_PATCH_REF') ?? false; if (empty($ref)) { $this->getIO()->write('No patch ref given'); @@ -126,6 +148,10 @@ public function applyPatch() { if ($this->gitService->applyPatch($ref)) { $this->getIO()->write('Could not apply patch ' . $ref . ' '); + return Command::FAILURE; + } else { + $this->getIO()->write('Apply patch ' . $ref . ''); + return Command::SUCCESS; } } @@ -133,10 +159,10 @@ public function cloneRepository(): int { if ($this->gitService->repositoryExists()) { $this->getIO()->writeError('Repository exists! Therefore no download required.'); - return Command::FAILURE; + return Command::SUCCESS; } - $this->getIO()->write('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $this->getIO()->overwrite('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; if ($this->gitService->cloneRepository($gitRemoteUrl)) { @@ -147,7 +173,8 @@ public function cloneRepository(): int return Command::SUCCESS; } - public function checkout() { + public function checkout() + { $branch = $this->input->getOption('branch') ?? getenv('TDK_BRANCH') ?? false; if (empty($branch)) { $branch = 'main'; diff --git a/packages/tdk-composer-plugin/src/Command/HookCommand.php b/packages/tdk-composer-plugin/src/Command/HookCommand.php index 088fec8..b514771 100644 --- a/packages/tdk-composer-plugin/src/Command/HookCommand.php +++ b/packages/tdk-composer-plugin/src/Command/HookCommand.php @@ -27,7 +27,8 @@ protected function configure() ->setDescription('Enable hooks') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force to overwrite hooks') ->addArgument('action', InputArgument::OPTIONAL, 'Create/delete hooks') - ->setHelp(<<setHelp( + <<io = $io; } public static function getSubscribedEvents() { - return []; + return [ +// 'post-root-package-install' => [ +// ['cloneRepository', 0] +// ], + 'post-install-cmd' => [ + ['cloneRepository', 0] + ], + ]; } public function getCapabilities(): array @@ -31,13 +53,35 @@ public function getCapabilities(): array ]; } - public function deactivate(Composer $composer, IOInterface $io) + public function deactivate(Composer $composer, IOInterface $io): void { // TODO: Implement deactivate() method. } - public function uninstall(Composer $composer, IOInterface $io) + public function uninstall(Composer $composer, IOInterface $io): void { // TODO: Implement uninstall() method. } + + public function cloneRepository(Event $event): int + { + $gitService = new GitService(); + + if ($gitService->repositoryExists()) { + $this->io->writeError('Repository exists! Therefore no download required.'); + return Command::SUCCESS; + } + + echo "'Cloning TYPO3 repository. This may take a while depending on your internet connection!'"; + $event->getIO()->debug('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; + if ($gitService->cloneRepository($gitRemoteUrl)) { + $event->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); + return Command::FAILURE; + } + + $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); + + return Command::SUCCESS; + } } diff --git a/packages/tdk-composer-plugin/src/Service/BaseService.php b/packages/tdk-composer-plugin/src/Service/BaseService.php index 3ca12f8..f618329 100644 --- a/packages/tdk-composer-plugin/src/Service/BaseService.php +++ b/packages/tdk-composer-plugin/src/Service/BaseService.php @@ -60,7 +60,6 @@ public static function getPhpVersion(string $jsonPath = ''): string preg_match_all('/[0-9].[0-9]/', $json['require']['php'], $versions); return trim($versions[0][0]); - } catch (\Exception $exception) { return '8.1'; } diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php new file mode 100644 index 0000000..8939954 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -0,0 +1,20 @@ +execute($command, $output); + + return $output; + } +} diff --git a/packages/tdk-composer-plugin/src/Service/GitService.php b/packages/tdk-composer-plugin/src/Service/GitService.php index fea1dc2..95934a5 100644 --- a/packages/tdk-composer-plugin/src/Service/GitService.php +++ b/packages/tdk-composer-plugin/src/Service/GitService.php @@ -10,16 +10,6 @@ class GitService extends BaseService { - public function setConfig(array $userData) - { - $pushUrl = 'ssh://' . $userData['username'] . '@review.typo3.org:29418/Packages/TYPO3.CMS.git'; - $this->setGitConfigValue('remote.origin.pushurl', $pushUrl); - $this->setGitConfigValue('user.name', $userData['display_name'] ?? $userData['name'] ?? $userData['username']); - $this->setGitConfigValue('user.email', $userData['email']); - - return Command::SUCCESS; - } - public function setCommitTemplate(string $filePath): int { $process = new ProcessExecutor(); @@ -27,7 +17,7 @@ public function setCommitTemplate(string $filePath): int return $process->execute('git config commit.template ' . $template, $output, BaseService::CORE_DEV_FOLDER); } - private function setGitConfigValue(string $config, string $value): void + public function setGitConfigValue(string $config, string $value): void { $process = new ProcessExecutor(); $command = 'git config ' . $config . ' "' . $value . '"'; diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index edcca60..9e5a114 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -20,22 +20,23 @@ public function clone(AcceptanceTester $I): void { // Use "composer install" because it triggers tdk:clone $I->runShellCommand('composer install'); - $I->seeResultCodeIs(0); - $I->seeInShellOutput('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $I->seeInShellOutput('Cloning into'); + $I->seeFileFound('config', self::$testFolder . self::$coreDevFolder . '.git/'); + + // @todo: Check why this is not working, no output ?! + // $I->seeInShellOutput('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + // $I->seeInShellOutput('Cloning into'); $I->runShellCommand('composer tdk:git clone'); - $I->seeResultCodeIs(0); - $I->seeInShellOutput('Repository exists! Therefore no download required.'); + // $I->canSeeInShellOutput('Repository exists! Therefore no download required.'); } - public function help(AcceptanceTester $I): void - { - $I->runShellCommand('composer tdk:help'); - - $I->seeResultCodeIs(0); - $I->seeInShellOutput('For more Details read the docs:', 'To be able to push to Gerrit, you need to add your public key'); - } +// public function help(AcceptanceTester $I): void +// { +// $I->runShellCommand('composer tdk:help'); +// +// $I->seeResultCodeIs(0); +// $I->seeInShellOutput('For more Details read the docs:', 'To be able to push to Gerrit, you need to add your public key'); +// } /** * @param AcceptanceTester $I @@ -83,7 +84,6 @@ public function enableHooks(AcceptanceTester $I): void $I->amGoingTo('Enable the hooks'); $I->runShellCommand('composer tdk:hooks create --force'); - $I->seeResultCodeIs(0); $I->seeFileFound('commit-msg', $hooksFolder); $I->seeFileFound('pre-commit', $hooksFolder); } @@ -109,9 +109,10 @@ public function applyPatch(AcceptanceTester $I): void public function ddevConfig(AcceptanceTester $I): void { $I->amGoingTo('use a invalid project name'); - $I->runShellCommand('composer tdk:ddev --project-name="typo3 invalid"'); - $I->seeInShellOutput('Invalid ddev project name'); + $I->runShellCommand('composer tdk:ddev --project-name="typo3 invalid"', false); + $I->seeInShellOutput('Invalid ddev project name "typo3 invalid"'); $I->dontSeeFileFound('.ddev', 'test-acceptance-tdk/'); + $I->seeResultCodeIs(1); $I->amGoingTo('abort configuration'); $I->runShellCommand('composer tdk:ddev --no'); From 45d867addde44d89fa35267e84016e46bb3bad43 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 18:58:36 +0200 Subject: [PATCH 09/60] [TASK] Add help command, fix tests, update readme commands --- README.md | 12 ++--- composer.json | 6 +-- .../src/Command/CommandProvider.php | 1 + .../src/Command/GitCommand.php | 2 +- .../src/Command/HelpCommand.php | 47 +++++++++++++++++++ packages/tdk-composer-plugin/src/Plugin.php | 7 +-- tests/Acceptance/TdkCest.php | 24 +++++----- 7 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 packages/tdk-composer-plugin/src/Command/HelpCommand.php diff --git a/README.md b/README.md index b576b41..a1495ab 100644 --- a/README.md +++ b/README.md @@ -30,16 +30,14 @@ composer based TYPO3 CoreDev environment. `composer ` * `tdk:setup`: Setup everything to run a Composer based CoreDev Setup -* `tdk:clear`: Delete all files and folder -* `tdk:remove-hooks`: Delete created hooks in `.git/hooks` -* `tdk:enable-hooks`: Create hooks copied from the TYPO3 repository -* `tdk:set-commit-template`: Configure TYPO3 repository to use `.gitmessage.txt` as commit message template +* `tdk:cleanup`: Delete all files and folder +* `tdk:hooks `: Create/delete created hooks in `.git/hooks` +* `tdk:git template`: Configure TYPO3 repository to use `.gitmessage.txt` as commit message template * `tdk:set-push-url`: Set Gerrit as remote to push patches to -* `tdk:ddev-config`: Create a basic ddev configuration +* `tdk:ddev`: Create a basic ddev configuration * `tdk:help`: Show summary with links to the TYPO3 Contribution Guide * `tdk:doctor`: Show potential issues -* `typo3`: Shortcut to run TYPO3 Commands -* `tdk:apply-patch`: Apply Gerrit patch e.g. `composer tdk:apply-patch -- --ref=refs/changes/75/72275/17` +* `tdk:git apply`: Apply Gerrit patch e.g. `composer tdk:git apply --ref=refs/changes/60/69360/6` ## Demo run diff --git a/composer.json b/composer.json index 4a475e2..c0fda08 100644 --- a/composer.json +++ b/composer.json @@ -12,14 +12,14 @@ "scripts": { "post-root-package-install": "@tdk:setup", "post-create-project-cmd": [ - "@tdk:help", - "Ochorocho\\Tdk\\Scripts\\MessageScript::done" + "composer tdk:help summary", + "composer tdk:help done" ], "tdk:setup": [ "composer tdk:git clone", "composer tdk:git config", "composer tdk:hooks create", - "composer tdk:ddev-config", + "composer tdk:ddev", "composer tdk:git template" ] }, diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index d73e390..a29d334 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -16,6 +16,7 @@ public function getCommands(): array new DoctorCommand(), new CleanupCommand(), new DdevConfigCommand(), + new HelpCommand() ]; } } diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index 1c564b1..b947408 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -158,7 +158,7 @@ public function applyPatch() public function cloneRepository(): int { if ($this->gitService->repositoryExists()) { - $this->getIO()->writeError('Repository exists! Therefore no download required.'); + $this->getIO()->write('Repository exists! Therefore no download required.'); return Command::SUCCESS; } diff --git a/packages/tdk-composer-plugin/src/Command/HelpCommand.php b/packages/tdk-composer-plugin/src/Command/HelpCommand.php new file mode 100644 index 0000000..d5a91e1 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/HelpCommand.php @@ -0,0 +1,47 @@ +setName('tdk:help') + ->setDescription('Show details to get more information about contributing') + ->addArgument('type', InputArgument::OPTIONAL, 'Which help text show.') + ->setHelp( + <<getArgument('type'); + $baseService = new GitService(); + + switch ($action) { + case 'summary': + $output->writeln($baseService->summary()); + break; + case 'done': + $output->writeln($baseService->done()); + break; + } + + return Command::SUCCESS; + } +} diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 03bc556..2cb3a99 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -68,12 +68,13 @@ public function cloneRepository(Event $event): int $gitService = new GitService(); if ($gitService->repositoryExists()) { - $this->io->writeError('Repository exists! Therefore no download required.'); + $this->io->write('Repository exists! Therefore no download required.', true, IOInterface::VERBOSE); return Command::SUCCESS; } - echo "'Cloning TYPO3 repository. This may take a while depending on your internet connection!'"; - $event->getIO()->debug('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $this->io->writeError('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $this->io->write('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $this->io->writeRaw('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; if ($gitService->cloneRepository($gitRemoteUrl)) { $event->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index 9e5a114..9996584 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -22,21 +22,21 @@ public function clone(AcceptanceTester $I): void $I->runShellCommand('composer install'); $I->seeFileFound('config', self::$testFolder . self::$coreDevFolder . '.git/'); - // @todo: Check why this is not working, no output ?! - // $I->seeInShellOutput('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - // $I->seeInShellOutput('Cloning into'); + $I->seeInShellOutput('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); + $I->seeInShellOutput('Cloning into'); $I->runShellCommand('composer tdk:git clone'); - // $I->canSeeInShellOutput('Repository exists! Therefore no download required.'); + $I->seeInShellOutput('Repository exists! Therefore no download required.'); } -// public function help(AcceptanceTester $I): void -// { -// $I->runShellCommand('composer tdk:help'); -// -// $I->seeResultCodeIs(0); -// $I->seeInShellOutput('For more Details read the docs:', 'To be able to push to Gerrit, you need to add your public key'); -// } + public function help(AcceptanceTester $I): void + { + $I->runShellCommand('composer tdk:help summary'); + $I->seeInShellOutput('For more Details read the docs:', 'To be able to push to Gerrit, you need to add your public key'); + + $I->runShellCommand('composer tdk:help done'); + $I->seeInShellOutput('TYPO3 Composer CoreDev Setup done'); + } /** * @param AcceptanceTester $I @@ -89,7 +89,7 @@ public function enableHooks(AcceptanceTester $I): void } /** - * @todo: Find a more generic way to test the tdk:apply-patch command + * @todo: Find a more generic way to test the tdk:git apply command * * @param AcceptanceTester $I */ From 291d2ce49a2371c4859e3b2feed8e0f9e6449b9d Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 20:18:54 +0200 Subject: [PATCH 10/60] [TASK] Move script definitions to plugins --- composer.json | 14 --- packages/tdk-composer-plugin/src/Plugin.php | 94 +++++++++++++++------ 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/composer.json b/composer.json index c0fda08..cfde5b1 100644 --- a/composer.json +++ b/composer.json @@ -9,20 +9,6 @@ "email": "jochen.roth@b13.com" } ], - "scripts": { - "post-root-package-install": "@tdk:setup", - "post-create-project-cmd": [ - "composer tdk:help summary", - "composer tdk:help done" - ], - "tdk:setup": [ - "composer tdk:git clone", - "composer tdk:git config", - "composer tdk:hooks create", - "composer tdk:ddev", - "composer tdk:git template" - ] - }, "repositories": { "local-packages": { "type": "path", diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 2cb3a99..1c55011 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -5,22 +5,16 @@ namespace Ochorocho\TdkComposer; use Composer\Composer; -use Composer\DependencyResolver\Operation\InstallOperation; +use Composer\Console\Application; use Composer\EventDispatcher\EventSubscriberInterface; -use Composer\Installer\PackageEvent; -use Composer\Installer\PackageEvents; use Composer\IO\IOInterface; use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; use Composer\Plugin\Capable as CapableInterface; -use Composer\Plugin\PluginEvents; use Composer\Plugin\PluginInterface; -use Composer\Plugin\PreFileDownloadEvent; use Composer\Script\Event; -use Composer\Script\ScriptEvents; use Ochorocho\TdkComposer\Command\CommandProvider; -use Ochorocho\TdkComposer\Command\GitCommand; -use Ochorocho\TdkComposer\Service\GitService; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\ArrayInput; final class Plugin implements PluginInterface, CapableInterface, EventSubscriberInterface { @@ -29,20 +23,37 @@ final class Plugin implements PluginInterface, CapableInterface, EventSubscriber */ protected $io; + /** + * @var Application $application + */ + protected $application; + public function activate(Composer $composer, IOInterface $io) { $this->io = $io; + $this->application = new Application(); + $this->application->setAutoExit(false); } public static function getSubscribedEvents() { return [ -// 'post-root-package-install' => [ -// ['cloneRepository', 0] -// ], 'post-install-cmd' => [ ['cloneRepository', 0] ], +// 'post-root-package-install' => [ +// ['gitConfig', 0], +// ['createHooks', 0], +// ['ddevConfig', 0], +// ['commitTemplate', 0] +// ], + 'post-create-project-cmd' => [ + ['gitConfig', 0], + ['createHooks', 0], + ['ddevConfig', 0], + ['commitTemplate', 0], + ['showInformation', 0] + ], ]; } @@ -65,24 +76,53 @@ public function uninstall(Composer $composer, IOInterface $io): void public function cloneRepository(Event $event): int { - $gitService = new GitService(); - - if ($gitService->repositoryExists()) { - $this->io->write('Repository exists! Therefore no download required.', true, IOInterface::VERBOSE); - return Command::SUCCESS; - } - - $this->io->writeError('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $this->io->write('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $this->io->writeRaw('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; - if ($gitService->cloneRepository($gitRemoteUrl)) { - $event->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); - return Command::FAILURE; - } - + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); + $this->application->run($input); $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); return Command::SUCCESS; } + + public function gitConfig(Event $event): int + { + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'config')); + $this->application->run($input); + + return Command::SUCCESS; + } + + public function createHooks(Event $event): int + { + $input = new ArrayInput(array('command' => 'tdk:hooks', 'action' => 'create')); + $this->application->run($input); + + return Command::SUCCESS; + } + + public function ddevConfig(Event $event): int + { + $input = new ArrayInput(array('command' => 'tdk:ddev')); + $this->application->run($input); + + return Command::SUCCESS; + } + + public function commitTemplate(Event $event): int + { + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'template')); + $this->application->run($input); + + return Command::SUCCESS; + } + + public function showInformation(Event $event): int + { + $input = new ArrayInput(array('command' => 'tdk:help', 'type' => 'summary')); + $this->application->run($input); + + $input = new ArrayInput(array('command' => 'tdk:help', 'type' => 'done')); + $this->application->run($input); + + return Command::SUCCESS; + } } From 5c659698253ead4b0d371218a26c1a1cb42704c0 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 20:37:42 +0200 Subject: [PATCH 11/60] [TASK] Run config after project create --- packages/tdk-composer-plugin/src/Plugin.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 1c55011..2cc6bde 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -41,12 +41,6 @@ public static function getSubscribedEvents() 'post-install-cmd' => [ ['cloneRepository', 0] ], -// 'post-root-package-install' => [ -// ['gitConfig', 0], -// ['createHooks', 0], -// ['ddevConfig', 0], -// ['commitTemplate', 0] -// ], 'post-create-project-cmd' => [ ['gitConfig', 0], ['createHooks', 0], From 30ccbcf8625ec6023afd9067e997f892858c2017 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 20:42:43 +0200 Subject: [PATCH 12/60] [TASK] Add clone to create project command --- packages/tdk-composer-plugin/src/Plugin.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 2cc6bde..741ab6b 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -38,10 +38,13 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ + // GitPod: Ensure the typo3-core folder exists 'post-install-cmd' => [ ['cloneRepository', 0] ], + // TDK initialization: Clone and configure local TYPO3 Core environment 'post-create-project-cmd' => [ + ['cloneRepository', 0], ['gitConfig', 0], ['createHooks', 0], ['ddevConfig', 0], From a0f69e971ac95ea937903355ec8ee2773026fdca Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 21:25:45 +0200 Subject: [PATCH 13/60] [TASK] Update Gitpod to use new tdk commands introduced by the plugin --- .gitpod.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index b4af360..ab009b2 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,6 +4,7 @@ # 8.0 https://gitpod.io/#TDK_PHP_VERSION=8.0,TDK_BRANCH=main,TDK_PATCH_REF=refs%2Fchanges%2F43%2F70643%2F36,TDK_USERNAME=ochorocho,TDK_PATCH_ID=70643/https://github.com/ochorocho/tdk/tree/main # Detect php: https://gitpod.io/#TDK_BRANCH=11.5,TDK_PATCH_REF=refs%2Fchanges%2F43%2F70643%2F36,TDK_USERNAME=ochorocho,TDK_PATCH_ID=70643/https://github.com/ochorocho/tdk/tree/main # https://gitpod.io/#TDK_BRANCH=11.5,TDK_PATCH_REF=refs%2Fchanges%2F43%2F70643%2F36,TDK_USERNAME=ochorocho,TDK_PATCH_ID=70643/https://github.com/ochorocho/tdk/tree/feature/add-ssh-command +# Composer Plugin: https://gitpod.io/#TDK_BRANCH=main,TDK_PATCH_REF=refs%2Fchanges%2F43%2F70643%2F36,TDK_USERNAME=ochorocho,TDK_PATCH_ID=70643/https://github.com/ochorocho/tdk/tree/feature/scripts-to-composer-plugin image: ochorocho/gitpod-tdk:latest @@ -14,14 +15,14 @@ tasks: cp -Rp .gitpod/phpstorm .idea tdk php "$(php .gitpod/php/version.php)" --no-reload gp open .gitpod/info.md - composer tdk:clone - composer tdk:checkout + composer tdk:git clone + composer tdk:git checkout composer install - composer tdk:set-git-config - composer tdk:enable-hooks -- --force - composer tdk:set-commit-template -- --file=./.gitmessage.txt + composer tdk:git config + composer tdk:hooks create --force + composer tdk:git template --file=./.gitmessage.txt tdk ssh-add - composer tdk:apply-patch + composer tdk:git apply composer install mkdir -p public/typo3conf touch public/FIRST_INSTALL @@ -34,9 +35,8 @@ tasks: sudo service cron start sleep 5 tdk db create - composer tdk:help + composer tdk:help summary tdk preview fe - gp sync-done tdk-done vscode: extensions: From 32b2563e821b7b051757d30987046c83f8486c0b Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 21:28:39 +0200 Subject: [PATCH 14/60] [TASK] Run composer install first before trying to use tdk:* commands --- .gitpod.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index ab009b2..271834a 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -15,9 +15,8 @@ tasks: cp -Rp .gitpod/phpstorm .idea tdk php "$(php .gitpod/php/version.php)" --no-reload gp open .gitpod/info.md - composer tdk:git clone - composer tdk:git checkout composer install + composer tdk:git checkout composer tdk:git config composer tdk:hooks create --force composer tdk:git template --file=./.gitmessage.txt From 198d5f805e3c70b6f08ca3642311b3bbd1e55746 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 19 Sep 2022 21:57:46 +0200 Subject: [PATCH 15/60] [TASK] Fiddle around with events --- .gitpod.yml | 2 ++ packages/tdk-composer-plugin/src/Plugin.php | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 271834a..13741d3 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -16,6 +16,7 @@ tasks: tdk php "$(php .gitpod/php/version.php)" --no-reload gp open .gitpod/info.md composer install + composer tdk:git clone composer tdk:git checkout composer tdk:git config composer tdk:hooks create --force @@ -35,6 +36,7 @@ tasks: sleep 5 tdk db create composer tdk:help summary + composer tdk:help done tdk preview fe vscode: diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 741ab6b..4de8007 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -7,6 +7,7 @@ use Composer\Composer; use Composer\Console\Application; use Composer\EventDispatcher\EventSubscriberInterface; +use Composer\Installer\PackageEvent; use Composer\IO\IOInterface; use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; use Composer\Plugin\Capable as CapableInterface; @@ -38,11 +39,9 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ - // GitPod: Ensure the typo3-core folder exists - 'post-install-cmd' => [ - ['cloneRepository', 0] + 'pre-autoload-dump' => [ + ['cloneRepository', 1000] ], - // TDK initialization: Clone and configure local TYPO3 Core environment 'post-create-project-cmd' => [ ['cloneRepository', 0], ['gitConfig', 0], @@ -50,7 +49,7 @@ public static function getSubscribedEvents() ['ddevConfig', 0], ['commitTemplate', 0], ['showInformation', 0] - ], + ] ]; } From 7cdc1c2559773797c167e8f8b88f9d01973a1b69 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Tue, 20 Sep 2022 21:24:55 +0200 Subject: [PATCH 16/60] [TASK] Clone repository right after composer plugin was set up --- packages/tdk-composer-plugin/src/Plugin.php | 30 ++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 4de8007..f0f210f 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -6,23 +6,23 @@ use Composer\Composer; use Composer\Console\Application; +use Composer\DependencyResolver\Operation\InstallOperation; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\Installer\PackageEvent; +use Composer\Installer\PackageEvents; use Composer\IO\IOInterface; use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; use Composer\Plugin\Capable as CapableInterface; use Composer\Plugin\PluginInterface; use Composer\Script\Event; +use Composer\Script\ScriptEvents; use Ochorocho\TdkComposer\Command\CommandProvider; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; final class Plugin implements PluginInterface, CapableInterface, EventSubscriberInterface { - /** - * @var IOInterface $io - */ - protected $io; + private const PACKAGE_NAME = 'ochorocho/tdk-composer-plugin'; /** * @var Application $application @@ -31,7 +31,6 @@ final class Plugin implements PluginInterface, CapableInterface, EventSubscriber public function activate(Composer $composer, IOInterface $io) { - $this->io = $io; $this->application = new Application(); $this->application->setAutoExit(false); } @@ -39,10 +38,10 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ - 'pre-autoload-dump' => [ - ['cloneRepository', 1000] + PackageEvents::POST_PACKAGE_INSTALL => [ + ['cloneRepository', 0] ], - 'post-create-project-cmd' => [ + ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['cloneRepository', 0], ['gitConfig', 0], ['createHooks', 0], @@ -70,11 +69,18 @@ public function uninstall(Composer $composer, IOInterface $io): void // TODO: Implement uninstall() method. } - public function cloneRepository(Event $event): int + public function cloneRepository(PackageEvent $event): int { - $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); - $this->application->run($input); - $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); + $operation = $event->getOperation(); + if ($operation instanceof InstallOperation) { + $package = $operation->getPackage()->getName(); + + if ($package === self::PACKAGE_NAME) { + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); + $this->application->run($input); + $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); + } + } return Command::SUCCESS; } From 1887449523587a8e214d377e3374271aba452e13 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Tue, 20 Sep 2022 22:01:26 +0200 Subject: [PATCH 17/60] [TASK] Do not clone repository on POST_CREATE_PROJECT_CMD --- packages/tdk-composer-plugin/src/Plugin.php | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index f0f210f..baab1be 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -42,7 +42,6 @@ public static function getSubscribedEvents() ['cloneRepository', 0] ], ScriptEvents::POST_CREATE_PROJECT_CMD => [ - ['cloneRepository', 0], ['gitConfig', 0], ['createHooks', 0], ['ddevConfig', 0], From 7b4b8b1745a4e5ccb795facf0e1123973f686b66 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Tue, 20 Sep 2022 23:34:21 +0200 Subject: [PATCH 18/60] [TASK] Update readme --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a1495ab..1ac9d96 100644 --- a/README.md +++ b/README.md @@ -25,19 +25,21 @@ composer based TYPO3 CoreDev environment. └── typo3-core # TYPO3 repository (master branch) git@github.com:TYPO3/typo3.git ``` -## Additional Composer commands/scripts +## Additional Composer commands `composer ` -* `tdk:setup`: Setup everything to run a Composer based CoreDev Setup * `tdk:cleanup`: Delete all files and folder * `tdk:hooks `: Create/delete created hooks in `.git/hooks` -* `tdk:git template`: Configure TYPO3 repository to use `.gitmessage.txt` as commit message template +* `tdk:git ` + * `config`: Set git name, email and pushurl + * `template`: Configure TYPO3 repository to use `.gitmessage.txt` as commit message template + * `apply`: Apply Gerrit patch e.g. `composer tdk:git apply --ref=refs/changes/60/69360/6` + * `clone`: Download and store the repository in `./typo3-core` * `tdk:set-push-url`: Set Gerrit as remote to push patches to * `tdk:ddev`: Create a basic ddev configuration -* `tdk:help`: Show summary with links to the TYPO3 Contribution Guide -* `tdk:doctor`: Show potential issues -* `tdk:git apply`: Apply Gerrit patch e.g. `composer tdk:git apply --ref=refs/changes/60/69360/6` +* `tdk:help `: Show informational text +* `tdk:doctor`: Show potential issues ## Demo run From 76e271e12c3305dd1af81441c4a9e18b822a76f0 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Tue, 20 Sep 2022 23:45:13 +0200 Subject: [PATCH 19/60] [TASK] Remove superfluous clone --- .gitpod.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitpod.yml b/.gitpod.yml index 13741d3..055aea7 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -16,7 +16,6 @@ tasks: tdk php "$(php .gitpod/php/version.php)" --no-reload gp open .gitpod/info.md composer install - composer tdk:git clone composer tdk:git checkout composer tdk:git config composer tdk:hooks create --force From 9d3d09fe0875920bbfc19475ff352bce5e087d2d Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 21 Sep 2022 00:29:25 +0200 Subject: [PATCH 20/60] [TASK] Update command help text --- packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php | 2 +- packages/tdk-composer-plugin/src/Command/GitCommand.php | 2 +- packages/tdk-composer-plugin/src/Command/HookCommand.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php b/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php index cca7a41..c6518bc 100644 --- a/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DdevConfigCommand.php @@ -26,7 +26,7 @@ protected function configure() ->addOption('no', null, InputOption::VALUE_NONE, 'Set all to no') ->setHelp( <<addOption('branch', null, InputOption::VALUE_OPTIONAL, 'Checkout a certain git branch.') ->setHelp( <<addArgument('action', InputArgument::OPTIONAL, 'Create/delete hooks') ->setHelp( << Date: Fri, 23 Sep 2022 19:31:33 +0200 Subject: [PATCH 21/60] [TASK] Streamline install of packages --- .gitignore | 3 +- composer.json | 41 +++---------------- packages/tdk-composer-plugin/composer.json | 1 + .../src/Command/GitCommand.php | 3 +- packages/tdk-composer-plugin/src/Plugin.php | 28 ++++++++++++- .../src/Service/GitService.php | 2 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 75fbc0d..f603dd4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ packages/* /config/ test-acceptance-tdk/ /tests/_support/_generated -/.vscode \ No newline at end of file +/.vscode +/.php-cs-fixer.cache diff --git a/composer.json b/composer.json index cfde5b1..d22aceb 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,12 @@ "email": "jochen.roth@b13.com" } ], + "minimum-stability": "dev", "repositories": { + "typo3-core-packages": { + "type": "path", + "url": "typo3-core/typo3/sysext/*" + }, "local-packages": { "type": "path", "url": "packages/*" @@ -17,41 +22,7 @@ }, "require": { "ext-json": "*", - "typo3/cms-adminpanel": "@dev", - "typo3/cms-backend": "@dev", - "typo3/cms-belog": "@dev", - "typo3/cms-beuser": "@dev", - "typo3/cms-core": "@dev", - "typo3/cms-dashboard": "@dev", - "typo3/cms-extbase": "@dev", - "typo3/cms-extensionmanager": "@dev", - "typo3/cms-felogin": "@dev", - "typo3/cms-filelist": "@dev", - "typo3/cms-filemetadata": "@dev", - "typo3/cms-fluid": "@dev", - "typo3/cms-fluid-styled-content": "@dev", - "typo3/cms-form": "@dev", - "typo3/cms-frontend": "@dev", - "typo3/cms-impexp": "@dev", - "typo3/cms-indexed-search": "@dev", - "typo3/cms-info": "@dev", - "typo3/cms-install": "@dev", - "typo3/cms-linkvalidator": "@dev", - "typo3/cms-lowlevel": "@dev", - "typo3/cms-opendocs": "@dev", - "typo3/cms-recordlist": "@dev", - "typo3/cms-recycler": "@dev", - "typo3/cms-redirects": "@dev", - "typo3/cms-reports": "@dev", - "typo3/cms-rte-ckeditor": "@dev", - "typo3/cms-scheduler": "@dev", - "typo3/cms-seo": "@dev", - "typo3/cms-setup": "@dev", - "typo3/cms-sys-note": "@dev", - "typo3/cms-t3editor": "@dev", - "typo3/cms-tstemplate": "@dev", - "typo3/cms-viewpage": "@dev", - "typo3/cms-workspaces": "@dev", + "typo3/cms-composer-installers": "^3", "ochorocho/tdk-composer-plugin": "@dev" }, "require-dev": { diff --git a/packages/tdk-composer-plugin/composer.json b/packages/tdk-composer-plugin/composer.json index 3fefc6e..d855af2 100644 --- a/packages/tdk-composer-plugin/composer.json +++ b/packages/tdk-composer-plugin/composer.json @@ -14,6 +14,7 @@ }, "extra": { "class": "Ochorocho\\TdkComposer\\Plugin", + "plugin-modifies-install-path": true, "plugin-modifies-downloads": true } } diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index bc8813d..2b20b60 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -164,7 +164,8 @@ public function cloneRepository(): int $this->getIO()->overwrite('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; + // $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; + $gitRemoteUrl = '/Users/jochen/Development/typo3-dev'; if ($this->gitService->cloneRepository($gitRemoteUrl)) { $this->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); return Command::FAILURE; diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index baab1be..6af8454 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -19,6 +19,7 @@ use Ochorocho\TdkComposer\Command\CommandProvider; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Filesystem\Filesystem; final class Plugin implements PluginInterface, CapableInterface, EventSubscriberInterface { @@ -75,9 +76,34 @@ public function cloneRepository(PackageEvent $event): int $package = $operation->getPackage()->getName(); if ($package === self::PACKAGE_NAME) { + $filsesystem = new Filesystem(); + $filsesystem->remove('typo3-core'); + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); + +// $repository = $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); +// $event->getComposer()->getRepositoryManager()->prependRepository($repository); + + $coreExtensionPackages = []; + $coreExtensions = [ + 'typo3/cms-core:@dev', + 'typo3/cms-backend:@dev', + 'typo3/cms-frontend:@dev', + 'typo3/cms-install:@dev', + ]; + + $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); + $this->application->run($input); + +// $localRepository = $event->getComposer()->getRepositoryManager()->getLocalRepository(); +// foreach($coreExtensions as $c) { +// $coreExtensionPackages[] = $event->getComposer()->getRepositoryManager()->getLocalRepository()->findPackage($c, '@dev'); +// //$coreExtensionPackages[] = $event->getComposer()->getRepositoryManager()->findPackages($c, '@dev'); +// } +// foreach($coreExtensionPackages as $corePackage) { +// $event->getComposer()->getInstallationManager()->install($localRepository, new InstallOperation($corePackage)); +// } } } diff --git a/packages/tdk-composer-plugin/src/Service/GitService.php b/packages/tdk-composer-plugin/src/Service/GitService.php index 95934a5..61f86ae 100644 --- a/packages/tdk-composer-plugin/src/Service/GitService.php +++ b/packages/tdk-composer-plugin/src/Service/GitService.php @@ -52,7 +52,7 @@ public function checkout(string $branch) public function repositoryExists(): bool { - return $this->filesystem->exists(BaseService::CORE_DEV_FOLDER); + return $this->filesystem->exists(BaseService::CORE_DEV_FOLDER . '/.git'); } public function latestCommit(): string From 1edd605ce9e644b15f982d31f79b6fb2403a3568 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sat, 24 Sep 2022 21:18:04 +0200 Subject: [PATCH 22/60] [TASK] Fix installation process During the installation process all packages in typo3-core/typo3/sysext are now required by default. The doctor command has been restructured and now also detects failed installs e.g. core packages are not symlinked. --- composer.json | 4 +- packages/tdk-composer-plugin/composer.json | 4 +- .../src/Command/DoctorCommand.php | 144 +++++++++++++----- .../src/Command/GitCommand.php | 4 +- packages/tdk-composer-plugin/src/Plugin.php | 36 +---- .../src/Service/ComposerService.php | 59 ++++++- 6 files changed, 170 insertions(+), 81 deletions(-) diff --git a/composer.json b/composer.json index d22aceb..0c91107 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,9 @@ "email": "jochen.roth@b13.com" } ], - "minimum-stability": "dev", + "scripts": { + "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + }, "repositories": { "typo3-core-packages": { "type": "path", diff --git a/packages/tdk-composer-plugin/composer.json b/packages/tdk-composer-plugin/composer.json index d855af2..39cf55e 100644 --- a/packages/tdk-composer-plugin/composer.json +++ b/packages/tdk-composer-plugin/composer.json @@ -4,8 +4,8 @@ "license": "GPL-2.0-or-later", "type": "composer-plugin", "require": { - "composer/composer": "^2.4", - "composer-plugin-api": "^2.3" + "composer/composer": "*", + "composer-plugin-api": "*" }, "autoload": { "psr-4": { diff --git a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php index 17b61c4..ce86fb4 100644 --- a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php @@ -7,6 +7,7 @@ use Composer\Command\BaseCommand; use Composer\Util\ProcessExecutor; use Ochorocho\TdkComposer\Service\BaseService; +use Ochorocho\TdkComposer\Service\ComposerService; use Ochorocho\TdkComposer\Service\GitService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -16,6 +17,20 @@ final class DoctorCommand extends BaseCommand { protected OutputInterface $output; + protected Filesystem $filesystem; + protected int $code; + protected ComposerService $composerService; + protected ProcessExecutor $process; + + protected function initialize(InputInterface $input, OutputInterface $output) + { + $this->filesystem = new Filesystem(); + $this->code = Command::SUCCESS; + $this->composerService = new ComposerService(); + $this->process = new ProcessExecutor(); + + parent::initialize($input, $output); + } protected function configure() { @@ -31,65 +46,110 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { - $code = Command::SUCCESS; - $filesystem = new Filesystem(); - $coreDevFolder = BaseService::CORE_DEV_FOLDER; - $iconSuccess = BaseService::ICON_SUCCESS; - $iconFailed = BaseService::ICON_FAILED; - - // Test for existing repository - if ($filesystem->exists($coreDevFolder . '/.git')) { - $gitService = new GitService(); - $commit = $gitService->latestCommit(); - $this->getIO()->write($iconSuccess . 'Repository exists on commit ' . $commit); + $this->testGitRepository(); + $this->testHooks(); + $this->testGitPushUrl(); + $this->testCommitTemplate(); + $this->testCoreExtensionSymlinked(); + $this->testVendor(); + + return $this->code; + } + + /** + * @return void + */ + protected function testVendor(): void + { + if ($this->filesystem->exists('vendor')) { + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Vendor folder exists.'); } else { - $this->getIO()->write($iconFailed . 'Repository not in place, please run "composer tdk:git clone"'); - $code = Command::FAILURE; + $this->getIO()->write(BaseService::ICON_FAILED . 'Vendor folder is missing, please run "composer install"'); + $this->code = Command::FAILURE; } + } - // Test if hooks are set up - if ($filesystem->exists([ - $coreDevFolder . '/.git/hooks/pre-commit', - $coreDevFolder . '/.git/hooks/commit-msg', - ])) { - $this->getIO()->write($iconSuccess . 'All hooks are in place.'); + protected function testCoreExtensionSymlinked(): void + { + // @todo: Test only extensions located in public/typo3/sysext + $coreExtensionFolders = $this->composerService->getCoreExtensionsFolder(); + $extensionTest = []; + foreach ($coreExtensionFolders as $folder) { + $path = 'public/typo3/sysext/' . $folder->getFileName(); + + $symlink = $this->filesystem->readlink($path, true); + + if ($symlink === null) { + $extensionTest['failed'][] = $folder->getFileName(); + } else { + $extensionTest['success'][] = $folder->getFileName(); + } + } + + if ($extensionTest['failed'] ?? false) { + $this->getIO()->write(BaseService::ICON_FAILED . 'Following extensions are not symlinked: ' . implode( + ', ', + $extensionTest['failed'] + )); + } + + if ($extensionTest['success'] ?? false) { + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Following extensions are symlinked: ' . implode( + ', ', + $extensionTest['success'] + )); + } + } + + protected function testCommitTemplate(): void + { + $commandTemplate = 'git config --get commit.template'; + $this->process->execute($commandTemplate, $outputTemplate, BaseService::CORE_DEV_FOLDER); + + if (!empty($outputTemplate) && $this->filesystem->exists(trim($outputTemplate))) { + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Git "commit.template" is set to ' . trim($outputTemplate) . '.'); } else { - $this->getIO()->write($iconFailed . 'Hooks are missing please run "composer tdk:hooks create".'); - $code = Command::FAILURE; + $this->getIO()->write(BaseService::ICON_FAILED . 'Git "commit.template" not set or file does not exist, please run "composer tdk:git template"'); + $this->code = Command::FAILURE; } + } - // Test git push url - $process = new ProcessExecutor(); + protected function testGitPushUrl(): void + { $command = 'git config --get remote.origin.pushurl'; - $process->execute($command, $commandOutput, $coreDevFolder); + $this->process->execute($command, $commandOutput, BaseService::CORE_DEV_FOLDER); preg_match('/^ssh:\/\/(.*)@review\.typo3\.org/', (string)$commandOutput, $matches); if (!empty($matches)) { - $this->getIO()->write($iconSuccess . 'Git "remote.origin.pushurl" seems correct.'); + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Git "remote.origin.pushurl" seems correct.'); } else { - $this->getIO()->write($iconFailed . 'Git "remote.origin.pushurl" not set correctly, please run "composer tdk:git config".'); - $code = Command::FAILURE; + $this->getIO()->write(BaseService::ICON_FAILED . 'Git "remote.origin.pushurl" not set correctly, please run "composer tdk:git config".'); + $this->code = Command::FAILURE; } + } - // Test commit template - $commandTemplate = 'git config --get commit.template'; - $process->execute($commandTemplate, $outputTemplate, $coreDevFolder); - - if (!empty($outputTemplate) && $filesystem->exists(trim($outputTemplate))) { - $this->getIO()->write($iconSuccess . 'Git "commit.template" is set to ' . trim($outputTemplate) . '.'); + protected function testHooks(): void + { + if ($this->filesystem->exists([ + BaseService::CORE_DEV_FOLDER . '/.git/hooks/pre-commit', + BaseService::CORE_DEV_FOLDER . '/.git/hooks/commit-msg', + ])) { + $this->getIO()->write(BaseService::ICON_SUCCESS . 'All hooks are in place.'); } else { - $this->getIO()->write($iconFailed . 'Git "commit.template" not set or file does not exist, please run "composer tdk:git template"'); - $code = Command::FAILURE; + $this->getIO()->write(BaseService::ICON_FAILED . 'Hooks are missing please run "composer tdk:hooks create".'); + $this->code = Command::FAILURE; } + } - // Test vendor folder - if ($filesystem->exists('vendor')) { - $this->getIO()->write($iconSuccess . 'Vendor folder exists.'); + protected function testGitRepository(): void + { + if ($this->filesystem->exists(BaseService::CORE_DEV_FOLDER . '/.git')) { + $gitService = new GitService(); + $commit = $gitService->latestCommit(); + $this->getIO()->write(BaseService::ICON_SUCCESS . 'Repository exists on commit ' . $commit); } else { - $this->getIO()->write($iconFailed . 'Vendor folder is missing, please run "composer install"'); - $code = Command::FAILURE; + $this->getIO()->write(BaseService::ICON_FAILED . 'Repository not in place, please run "composer tdk:git clone"'); + $this->code = Command::FAILURE; } - - return $code; } } diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index 2b20b60..4883aed 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -164,8 +164,8 @@ public function cloneRepository(): int $this->getIO()->overwrite('Cloning TYPO3 repository. This may take a while depending on your internet connection!'); - // $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; - $gitRemoteUrl = '/Users/jochen/Development/typo3-dev'; + $gitRemoteUrl = 'https://github.com/TYPO3/typo3.git'; + // $gitRemoteUrl = '/Users/jochen/Development/typo3-dev'; if ($this->gitService->cloneRepository($gitRemoteUrl)) { $this->getIO()->write('Could not download git repository ' . $gitRemoteUrl . ' '); return Command::FAILURE; diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 6af8454..3281fa3 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -17,6 +17,8 @@ use Composer\Script\Event; use Composer\Script\ScriptEvents; use Ochorocho\TdkComposer\Command\CommandProvider; +use Ochorocho\TdkComposer\Service\BaseService; +use Ochorocho\TdkComposer\Service\ComposerService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Filesystem\Filesystem; @@ -25,15 +27,14 @@ final class Plugin implements PluginInterface, CapableInterface, EventSubscriber { private const PACKAGE_NAME = 'ochorocho/tdk-composer-plugin'; - /** - * @var Application $application - */ - protected $application; + protected Application $application; + protected ComposerService $composerService; public function activate(Composer $composer, IOInterface $io) { $this->application = new Application(); $this->application->setAutoExit(false); + $this->composerService = new ComposerService(); } public static function getSubscribedEvents() @@ -76,34 +77,13 @@ public function cloneRepository(PackageEvent $event): int $package = $operation->getPackage()->getName(); if ($package === self::PACKAGE_NAME) { - $filsesystem = new Filesystem(); - $filsesystem->remove('typo3-core'); + $filesystem = new Filesystem(); + $filesystem->remove([BaseService::CORE_DEV_FOLDER]); $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); -// $repository = $event->getComposer()->getRepositoryManager()->createRepository('path', ['url' => 'typo3-core/typo3/sysext/*'], 'typo3-core-packages'); -// $event->getComposer()->getRepositoryManager()->prependRepository($repository); - - $coreExtensionPackages = []; - $coreExtensions = [ - 'typo3/cms-core:@dev', - 'typo3/cms-backend:@dev', - 'typo3/cms-frontend:@dev', - 'typo3/cms-install:@dev', - ]; - - $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); - $this->application->run($input); - -// $localRepository = $event->getComposer()->getRepositoryManager()->getLocalRepository(); -// foreach($coreExtensions as $c) { -// $coreExtensionPackages[] = $event->getComposer()->getRepositoryManager()->getLocalRepository()->findPackage($c, '@dev'); -// //$coreExtensionPackages[] = $event->getComposer()->getRepositoryManager()->findPackages($c, '@dev'); -// } -// foreach($coreExtensionPackages as $corePackage) { -// $event->getComposer()->getInstallationManager()->install($localRepository, new InstallOperation($corePackage)); -// } + $this->composerService->requireAllCoreExtensions(); } } diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php index 8939954..d62f65b 100644 --- a/packages/tdk-composer-plugin/src/Service/ComposerService.php +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -4,17 +4,64 @@ namespace Ochorocho\TdkComposer\Service; -use Composer\Util\ProcessExecutor; +use Composer\Console\Application; +use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Finder\Finder; class ComposerService extends BaseService { - public function addRepository(): string + protected Application $application; + protected Finder $finder; + + public function __construct() + { + $this->application = new Application(); + $this->finder = new Finder(); + + parent::__construct(); + } + + public function getCoreExtensions(): array + { + $files = $this->finder->name('composer.json')->in(BaseService::CORE_DEV_FOLDER . '/typo3/sysext/')->depth(1)->files(); + + $coreExtensions = []; + foreach ($files as $file) { + $json = json_decode($file->getContents(), true, 512, JSON_THROW_ON_ERROR); + $coreExtensions[] = $json['name']; + } + + return $coreExtensions; + } + + public function requireAllCoreExtensions(): int { - $process = new ProcessExecutor(); - $command = 'composer config repositories.typo3-core-packages path "typo3-core/typo3/sysext/*"'; - $process->execute($command, $output); + $coreExtensions = $this->getCoreExtensions(); + foreach ($coreExtensions as $key => $extension) { + $coreExtensions[$key] = $extension . ':@dev'; + } + + if (count($coreExtensions)) { + $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); + return $this->application->run($input); + } - return $output; + return 0; + } + + public function removeAllCoreExtensions(): int + { + $coreExtensions = $this->getCoreExtensions(); + if (count($coreExtensions)) { + $input = new ArrayInput(array('command' => 'remove', 'packages' => $coreExtensions)); + return $this->application->run($input); + } + + return 0; + } + + public function getCoreExtensionsFolder(): Finder + { + return $this->finder->in(BaseService::CORE_DEV_FOLDER . '/typo3/sysext/')->depth(0)->directories(); } } From 9d9269482c215092927563a63ec2dd6a18c9b096 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sat, 24 Sep 2022 21:35:03 +0200 Subject: [PATCH 23/60] [TASK] Test only extensions in public/typo3/sysext for existence and symlink. --- .../tdk-composer-plugin/src/Service/ComposerService.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php index d62f65b..185b108 100644 --- a/packages/tdk-composer-plugin/src/Service/ComposerService.php +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -21,9 +21,9 @@ public function __construct() parent::__construct(); } - public function getCoreExtensions(): array + public function getCoreExtensions(string $path = BaseService::CORE_DEV_FOLDER . '/typo3/sysext/'): array { - $files = $this->finder->name('composer.json')->in(BaseService::CORE_DEV_FOLDER . '/typo3/sysext/')->depth(1)->files(); + $files = $this->finder->name('composer.json')->in($path)->depth(1)->files(); $coreExtensions = []; foreach ($files as $file) { @@ -60,8 +60,8 @@ public function removeAllCoreExtensions(): int return 0; } - public function getCoreExtensionsFolder(): Finder + public function getCoreExtensionsFolder(string $path = 'public/typo3/sysext'): Finder { - return $this->finder->in(BaseService::CORE_DEV_FOLDER . '/typo3/sysext/')->depth(0)->directories(); + return $this->finder->in($path)->depth(0)->directories(); } } From 07912da50caf333d29388a6d39be8c2e750fd392 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sat, 24 Sep 2022 23:57:17 +0200 Subject: [PATCH 24/60] [TASK] Add test if extension in public/typo3/sysext/* is symlink --- .../src/Command/DoctorCommand.php | 11 +++- tests/Acceptance/TdkCest.php | 60 ++++++++++++++++++- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php index ce86fb4..2de0e63 100644 --- a/packages/tdk-composer-plugin/src/Command/DoctorCommand.php +++ b/packages/tdk-composer-plugin/src/Command/DoctorCommand.php @@ -13,6 +13,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Exception\DirectoryNotFoundException; final class DoctorCommand extends BaseCommand { @@ -71,8 +72,13 @@ protected function testVendor(): void protected function testCoreExtensionSymlinked(): void { - // @todo: Test only extensions located in public/typo3/sysext - $coreExtensionFolders = $this->composerService->getCoreExtensionsFolder(); + try { + $coreExtensionFolders = $this->composerService->getCoreExtensionsFolder(); + } catch (DirectoryNotFoundException $exception) { + $this->getIO()->write($exception->getMessage()); + return; + } + $extensionTest = []; foreach ($coreExtensionFolders as $folder) { $path = 'public/typo3/sysext/' . $folder->getFileName(); @@ -81,6 +87,7 @@ protected function testCoreExtensionSymlinked(): void if ($symlink === null) { $extensionTest['failed'][] = $folder->getFileName(); + $this->code = Command::FAILURE; } else { $extensionTest['success'][] = $folder->getFileName(); } diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index 9996584..fd69033 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -4,14 +4,17 @@ namespace Acceptance; -use AcceptanceTester as AcceptanceTester; +use AcceptanceTester; +use Codeception\Example; +use Symfony\Component\Filesystem\Filesystem; class TdkCest { private static string $coreDevFolder = 'typo3-core/'; + private static string $extensionFolder = 'public/typo3/sysext/'; private static string $testFolder = __DIR__ . '/../../test-acceptance-tdk/'; - public function _before(AcceptanceTester $I) + public function _before(AcceptanceTester $I): void { chdir(self::$testFolder); } @@ -29,6 +32,19 @@ public function clone(AcceptanceTester $I): void $I->seeInShellOutput('Repository exists! Therefore no download required.'); } + /** + * @param AcceptanceTester $I + * @param Example $testData + * @return void + * @dataProvider extensionsDataProvider + */ + public function extensionIsSymlink(AcceptanceTester $I, Example $testData): void + { + $filesystem = new Filesystem(); + $symlink = $filesystem->readlink(static::$extensionFolder . $testData['ext'], true); + $I->assertNotNull($symlink); + } + public function help(AcceptanceTester $I): void { $I->runShellCommand('composer tdk:help summary'); @@ -199,4 +215,44 @@ protected function clearDataProvider(): array 'var', ]; } + + protected function extensionsDataProvider(): array + { + return [ + ['ext' => 'adminpanel'], + ['ext' => 'backend'], + ['ext' => 'belog'], + ['ext' => 'beuser'], + ['ext' => 'core'], + ['ext' => 'dashboard'], + ['ext' => 'extbase'], + ['ext' => 'extensionmanager'], + ['ext' => 'felogin'], + ['ext' => 'filelist'], + ['ext' => 'filemetadata'], + ['ext' => 'fluid'], + ['ext' => 'fluid_styled_content'], + ['ext' => 'form'], + ['ext' => 'frontend'], + ['ext' => 'impexp'], + ['ext' => 'indexed_search'], + ['ext' => 'info'], + ['ext' => 'install'], + ['ext' => 'linkvalidator'], + ['ext' => 'lowlevel'], + ['ext' => 'opendocs'], + ['ext' => 'recycler'], + ['ext' => 'redirects'], + ['ext' => 'reports'], + ['ext' => 'rte_ckeditor'], + ['ext' => 'scheduler'], + ['ext' => 'seo'], + ['ext' => 'setup'], + ['ext' => 'sys_note'], + ['ext' => 't3editor'], + ['ext' => 'tstemplate'], + ['ext' => 'viewpage'], + ['ext' => 'workspaces'] + ]; + } } From 09fa1a278f3099c084adab0c9a537b68fd181715 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 13:12:56 +0200 Subject: [PATCH 25/60] [TASK] Add tdk:composer command This allows to require and remove all core extensions at once. Help is now more detailed for tdk:git --- README.md | 3 +- packages/.gitkeep | 0 packages/tdk-composer-plugin/.gitignore | 2 +- .../src/Command/CommandProvider.php | 3 +- .../src/Command/ComposerCommand.php | 58 +++++++++++++ .../src/Command/GitCommand.php | 9 +- .../src/Service/ComposerService.php | 31 +++---- tests/Acceptance/TdkCest.php | 20 ++++- tests/_data/composer-core-packages.json | 82 +++++++++++++++++++ .../_data/composer-without-core-packages.json | 47 +++++++++++ tests/_support/AcceptanceTester.php | 10 ++- 11 files changed, 244 insertions(+), 21 deletions(-) delete mode 100644 packages/.gitkeep create mode 100644 packages/tdk-composer-plugin/src/Command/ComposerCommand.php create mode 100644 tests/_data/composer-core-packages.json create mode 100644 tests/_data/composer-without-core-packages.json diff --git a/README.md b/README.md index 1ac9d96..bf84758 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ composer based TYPO3 CoreDev environment. `composer ` -* `tdk:cleanup`: Delete all files and folder +* `tdk:cleanup`: Delete all files and folder including the `typo3-core` repository * `tdk:hooks `: Create/delete created hooks in `.git/hooks` * `tdk:git ` * `config`: Set git name, email and pushurl @@ -38,6 +38,7 @@ composer based TYPO3 CoreDev environment. * `clone`: Download and store the repository in `./typo3-core` * `tdk:set-push-url`: Set Gerrit as remote to push patches to * `tdk:ddev`: Create a basic ddev configuration +* `tdk:composer `: Require or remove all TYPO3 Core extensions * `tdk:help `: Show informational text * `tdk:doctor`: Show potential issues diff --git a/packages/.gitkeep b/packages/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/tdk-composer-plugin/.gitignore b/packages/tdk-composer-plugin/.gitignore index 351baa5..ff72e2d 100644 --- a/packages/tdk-composer-plugin/.gitignore +++ b/packages/tdk-composer-plugin/.gitignore @@ -1,2 +1,2 @@ /composer.lock -/vendor \ No newline at end of file +/vendor diff --git a/packages/tdk-composer-plugin/src/Command/CommandProvider.php b/packages/tdk-composer-plugin/src/Command/CommandProvider.php index a29d334..591fa8d 100644 --- a/packages/tdk-composer-plugin/src/Command/CommandProvider.php +++ b/packages/tdk-composer-plugin/src/Command/CommandProvider.php @@ -16,7 +16,8 @@ public function getCommands(): array new DoctorCommand(), new CleanupCommand(), new DdevConfigCommand(), - new HelpCommand() + new HelpCommand(), + new ComposerCommand() ]; } } diff --git a/packages/tdk-composer-plugin/src/Command/ComposerCommand.php b/packages/tdk-composer-plugin/src/Command/ComposerCommand.php new file mode 100644 index 0000000..0d777e2 --- /dev/null +++ b/packages/tdk-composer-plugin/src/Command/ComposerCommand.php @@ -0,0 +1,58 @@ +composerService = new ComposerService(); + + parent::initialize($input, $output); + } + + protected function configure() + { + $this + ->setName('tdk:composer') + ->setDescription('Manage TYPO3 Core packages with composer.') + ->addArgument('action', InputArgument::OPTIONAL, 'Require/remove all TYPO3 system extensions') + ->setHelp( + <<getArgument('action'); + + switch ($action) { + case 'require': + $this->composerService->requireAllCoreExtensions(); + break; + case 'remove': + $this->composerService->removeAllCoreExtensions(); + break; + default: + $this->getIO()->write($this->getHelp()); + } + + return Command::SUCCESS; + } +} diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index 4883aed..cbe4aee 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -42,7 +42,12 @@ protected function configure() ->addOption('branch', null, InputOption::VALUE_OPTIONAL, 'Checkout a certain git branch.') ->setHelp( << - Apply patch to core from Gerrit + * clone - clone TYPO3 Core repository + * checkout --branch - Checkout branch EOT ); } @@ -69,6 +74,8 @@ protected function execute(InputInterface $input, OutputInterface $output) case 'checkout': $this->checkout(); break; + default: + $this->getIO()->write($this->getHelp()); } return Command::SUCCESS; diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php index 185b108..24f5cb9 100644 --- a/packages/tdk-composer-plugin/src/Service/ComposerService.php +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -5,6 +5,7 @@ namespace Ochorocho\TdkComposer\Service; use Composer\Console\Application; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Finder\Finder; @@ -21,19 +22,6 @@ public function __construct() parent::__construct(); } - public function getCoreExtensions(string $path = BaseService::CORE_DEV_FOLDER . '/typo3/sysext/'): array - { - $files = $this->finder->name('composer.json')->in($path)->depth(1)->files(); - - $coreExtensions = []; - foreach ($files as $file) { - $json = json_decode($file->getContents(), true, 512, JSON_THROW_ON_ERROR); - $coreExtensions[] = $json['name']; - } - - return $coreExtensions; - } - public function requireAllCoreExtensions(): int { $coreExtensions = $this->getCoreExtensions(); @@ -46,7 +34,7 @@ public function requireAllCoreExtensions(): int return $this->application->run($input); } - return 0; + return Command::SUCCESS; } public function removeAllCoreExtensions(): int @@ -57,11 +45,24 @@ public function removeAllCoreExtensions(): int return $this->application->run($input); } - return 0; + return Command::SUCCESS; } public function getCoreExtensionsFolder(string $path = 'public/typo3/sysext'): Finder { return $this->finder->in($path)->depth(0)->directories(); } + + private function getCoreExtensions(string $path = BaseService::CORE_DEV_FOLDER . '/typo3/sysext/'): array + { + $files = $this->finder->name('composer.json')->in($path)->depth(1)->files(); + + $coreExtensions = []; + foreach ($files as $file) { + $json = json_decode($file->getContents(), true, 512, JSON_THROW_ON_ERROR); + $coreExtensions[] = $json['name']; + } + + return $coreExtensions; + } } diff --git a/tests/Acceptance/TdkCest.php b/tests/Acceptance/TdkCest.php index fd69033..dcd56b1 100644 --- a/tests/Acceptance/TdkCest.php +++ b/tests/Acceptance/TdkCest.php @@ -45,6 +45,25 @@ public function extensionIsSymlink(AcceptanceTester $I, Example $testData): void $I->assertNotNull($symlink); } + public function composerCommand(AcceptanceTester $I): void + { + $I->amGoingTo('Remove all core extensions'); + $I->runShellCommand('composer tdk:composer remove'); + $composerJson = $I->loadRootComposerJsonToArray(); + $exampleJsonRemove = $I->loadExampleComposerJsonToArray('composer-without-core-packages.json'); + $I->assertEquals($exampleJsonRemove['require'], $composerJson['require']); + + $I->amGoingTo('Require all core extensions'); + $I->runShellCommand('composer tdk:composer require'); + $composerJson = $I->loadRootComposerJsonToArray(); + $exampleJsonRequire = $I->loadExampleComposerJsonToArray('composer-core-packages.json'); + $I->assertEquals($exampleJsonRequire['require'], $composerJson['require']); + + $I->amGoingTo('See expected scripts are in place to create the initial repository folder'); + $composerJson = $I->loadRootComposerJsonToArray(); + $I->assertEquals($composerJson['scripts'], ['command' => '[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext']); + } + public function help(AcceptanceTester $I): void { $I->runShellCommand('composer tdk:help summary'); @@ -138,7 +157,6 @@ public function ddevConfig(AcceptanceTester $I): void $I->amGoingTo('create a ddev config'); $I->runShellCommand('composer tdk:ddev --project-name="typo3-dev-tdk"'); $I->seeFileFound('config.yaml', 'test-acceptance-tdk/.ddev/'); - $I->seeResultCodeIs(0); } /** diff --git a/tests/_data/composer-core-packages.json b/tests/_data/composer-core-packages.json new file mode 100644 index 0000000..dc32917 --- /dev/null +++ b/tests/_data/composer-core-packages.json @@ -0,0 +1,82 @@ +{ + "name": "ochorocho/tdk", + "description": "TYPO3 Composer Development Kit", + "type": "project", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Jochen Roth", + "email": "jochen.roth@b13.com" + } + ], + "scripts": { + "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + }, + "repositories": { + "typo3-core-packages": { + "type": "path", + "url": "typo3-core/typo3/sysext/*" + }, + "local-packages": { + "type": "path", + "url": "packages/*" + } + }, + "require": { + "ext-json": "*", + "typo3/cms-composer-installers": "^3", + "ochorocho/tdk-composer-plugin": "@dev", + "typo3/cms-extbase": "@dev", + "typo3/cms-belog": "@dev", + "typo3/cms-adminpanel": "@dev", + "typo3/cms-form": "@dev", + "typo3/cms-install": "@dev", + "typo3/cms-filemetadata": "@dev", + "typo3/cms-core": "@dev", + "typo3/cms-frontend": "@dev", + "typo3/cms-felogin": "@dev", + "typo3/cms-linkvalidator": "@dev", + "typo3/cms-setup": "@dev", + "typo3/cms-impexp": "@dev", + "typo3/cms-fluid-styled-content": "@dev", + "typo3/cms-scheduler": "@dev", + "typo3/cms-backend": "@dev", + "typo3/cms-workspaces": "@dev", + "typo3/cms-fluid": "@dev", + "typo3/cms-tstemplate": "@dev", + "typo3/cms-info": "@dev", + "typo3/cms-dashboard": "@dev", + "typo3/cms-recycler": "@dev", + "typo3/cms-redirects": "@dev", + "typo3/cms-extensionmanager": "@dev", + "typo3/cms-filelist": "@dev", + "typo3/cms-t3editor": "@dev", + "typo3/cms-lowlevel": "@dev", + "typo3/cms-beuser": "@dev", + "typo3/cms-rte-ckeditor": "@dev", + "typo3/cms-seo": "@dev", + "typo3/cms-viewpage": "@dev", + "typo3/cms-opendocs": "@dev", + "typo3/cms-sys-note": "@dev", + "typo3/cms-indexed-search": "@dev", + "typo3/cms-reports": "@dev", + "typo3/cms-recordlist": "@dev" + }, + "require-dev": { + "codeception/codeception": "*", + "codeception/module-cli": "*", + "codeception/module-webdriver": "*", + "phpstan/phpstan": "*", + "composer/composer": "*", + "friendsofphp/php-cs-fixer": "*", + "codeception/module-asserts": "*", + "codeception/module-filesystem": "*" + }, + "config": { + "allow-plugins": { + "typo3/class-alias-loader": true, + "typo3/cms-composer-installers": true, + "ochorocho/tdk-composer-plugin": true + } + } +} diff --git a/tests/_data/composer-without-core-packages.json b/tests/_data/composer-without-core-packages.json new file mode 100644 index 0000000..0c91107 --- /dev/null +++ b/tests/_data/composer-without-core-packages.json @@ -0,0 +1,47 @@ +{ + "name": "ochorocho/tdk", + "description": "TYPO3 Composer Development Kit", + "type": "project", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Jochen Roth", + "email": "jochen.roth@b13.com" + } + ], + "scripts": { + "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + }, + "repositories": { + "typo3-core-packages": { + "type": "path", + "url": "typo3-core/typo3/sysext/*" + }, + "local-packages": { + "type": "path", + "url": "packages/*" + } + }, + "require": { + "ext-json": "*", + "typo3/cms-composer-installers": "^3", + "ochorocho/tdk-composer-plugin": "@dev" + }, + "require-dev": { + "codeception/codeception": "*", + "codeception/module-cli": "*", + "codeception/module-webdriver": "*", + "phpstan/phpstan": "*", + "composer/composer": "*", + "friendsofphp/php-cs-fixer": "*", + "codeception/module-asserts": "*", + "codeception/module-filesystem": "*" + }, + "config": { + "allow-plugins": { + "typo3/class-alias-loader": true, + "typo3/cms-composer-installers": true, + "ochorocho/tdk-composer-plugin": true + } + } +} diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php index a7d7dac..9703639 100644 --- a/tests/_support/AcceptanceTester.php +++ b/tests/_support/AcceptanceTester.php @@ -2,7 +2,6 @@ declare(strict_types=1); - /** * Inherited Methods * @method void wantToTest($text) @@ -24,4 +23,13 @@ class AcceptanceTester extends \Codeception\Actor /** * Define custom actions here */ + public function loadRootComposerJsonToArray(): array + { + return json_decode(file_get_contents('composer.json'), true, 512, JSON_THROW_ON_ERROR); + } + + public function loadExampleComposerJsonToArray(string $path) + { + return json_decode(file_get_contents(codecept_data_dir($path)), true, 512, JSON_THROW_ON_ERROR); + } } From c1ed58f51e8ece828b739ac39042c4a16d8d1c37 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 14:32:10 +0200 Subject: [PATCH 26/60] [TASK] Add post-root-package-install script to ensure repo folder exists --- packages/tdk-composer-plugin/src/Plugin.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 3281fa3..16e88af 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -43,11 +43,14 @@ public static function getSubscribedEvents() PackageEvents::POST_PACKAGE_INSTALL => [ ['cloneRepository', 0] ], - ScriptEvents::POST_CREATE_PROJECT_CMD => [ + ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ + ['ensureRepoExists', 0], ['gitConfig', 0], ['createHooks', 0], ['ddevConfig', 0], ['commitTemplate', 0], + ], + ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['showInformation', 0] ] ]; @@ -132,4 +135,13 @@ public function showInformation(Event $event): int return Command::SUCCESS; } + + public function ensureRepoExists(Event $event): int + { + // $filesystem = new Filesystem(); + // $filesystem->mkdir('typo3-core/typo3/sysext'); + exec('[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext'); + return Command::SUCCESS; + } + } From 58bd00f23e957694869f26832439a0c4c8b0914d Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 15:46:00 +0200 Subject: [PATCH 27/60] [TASK] TEST Create project --- .gitignore | 1 - typo3-core/typo3/sysext/.gitkeep | 0 2 files changed, 1 deletion(-) create mode 100644 typo3-core/typo3/sysext/.gitkeep diff --git a/.gitignore b/.gitignore index f603dd4..97ac813 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ var/ public/ composer.lock .idea -typo3-core packages/* !packages/.gitkeep !packages/tdk-composer-plugin diff --git a/typo3-core/typo3/sysext/.gitkeep b/typo3-core/typo3/sysext/.gitkeep new file mode 100644 index 0000000..e69de29 From 4aacc5afa6cf98374a98790f1a190887597716b1 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 16:07:41 +0200 Subject: [PATCH 28/60] [TASK] TEST Create project --- composer.json | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 0c91107..e57f66e 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,20 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext", + "pre-install-cmd": "@tdk:git clone", + "post-root-package-install": "@tdk:setup", + "post-create-project-cmd": [ + "@tdk:help summary", + "@tdk:help done" + ], + "tdk:setup": [ + "@tdk:git clone", + "@tdk:git config", + "@tdk:hooks create", + "@tdk:ddev", + "@tdk:set-commit-template" + ] }, "repositories": { "typo3-core-packages": { @@ -25,7 +38,42 @@ "require": { "ext-json": "*", "typo3/cms-composer-installers": "^3", - "ochorocho/tdk-composer-plugin": "@dev" + "ochorocho/tdk-composer-plugin": "@dev", + "typo3/cms-extbase": "@dev", + "typo3/cms-belog": "@dev", + "typo3/cms-adminpanel": "@dev", + "typo3/cms-form": "@dev", + "typo3/cms-install": "@dev", + "typo3/cms-filemetadata": "@dev", + "typo3/cms-core": "@dev", + "typo3/cms-frontend": "@dev", + "typo3/cms-felogin": "@dev", + "typo3/cms-linkvalidator": "@dev", + "typo3/cms-setup": "@dev", + "typo3/cms-impexp": "@dev", + "typo3/cms-fluid-styled-content": "@dev", + "typo3/cms-scheduler": "@dev", + "typo3/cms-backend": "@dev", + "typo3/cms-workspaces": "@dev", + "typo3/cms-fluid": "@dev", + "typo3/cms-tstemplate": "@dev", + "typo3/cms-info": "@dev", + "typo3/cms-dashboard": "@dev", + "typo3/cms-recycler": "@dev", + "typo3/cms-redirects": "@dev", + "typo3/cms-extensionmanager": "@dev", + "typo3/cms-filelist": "@dev", + "typo3/cms-t3editor": "@dev", + "typo3/cms-lowlevel": "@dev", + "typo3/cms-beuser": "@dev", + "typo3/cms-rte-ckeditor": "@dev", + "typo3/cms-seo": "@dev", + "typo3/cms-viewpage": "@dev", + "typo3/cms-opendocs": "@dev", + "typo3/cms-sys-note": "@dev", + "typo3/cms-indexed-search": "@dev", + "typo3/cms-reports": "@dev", + "typo3/cms-recordlist": "@dev" }, "require-dev": { "codeception/codeception": "*", From 6a5ca62d45f26f0ab61025f29b30d6deb7ba5d5b Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 16:10:06 +0200 Subject: [PATCH 29/60] [TASK] TEST Create project --- composer.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index e57f66e..6aeb786 100644 --- a/composer.json +++ b/composer.json @@ -11,18 +11,18 @@ ], "scripts": { "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext", - "pre-install-cmd": "@tdk:git clone", + "pre-install-cmd": "composer tdk:git clone", "post-root-package-install": "@tdk:setup", "post-create-project-cmd": [ - "@tdk:help summary", - "@tdk:help done" + "composer tdk:help summary", + "composer tdk:help done" ], "tdk:setup": [ - "@tdk:git clone", - "@tdk:git config", - "@tdk:hooks create", - "@tdk:ddev", - "@tdk:set-commit-template" + "composer tdk:git clone", + "composer tdk:git config", + "composer tdk:hooks create", + "composer tdk:ddev", + "composer tdk:set-commit-template" ] }, "repositories": { From ff284b338c610974822da5e5836be7f86cf14d22 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:07:27 +0200 Subject: [PATCH 30/60] [TASK] TEST Create project --- composer.json | 51 ++------------------------------------------------- 1 file changed, 2 insertions(+), 49 deletions(-) diff --git a/composer.json b/composer.json index 6aeb786..073bf6c 100644 --- a/composer.json +++ b/composer.json @@ -11,19 +11,7 @@ ], "scripts": { "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext", - "pre-install-cmd": "composer tdk:git clone", - "post-root-package-install": "@tdk:setup", - "post-create-project-cmd": [ - "composer tdk:help summary", - "composer tdk:help done" - ], - "tdk:setup": [ - "composer tdk:git clone", - "composer tdk:git config", - "composer tdk:hooks create", - "composer tdk:ddev", - "composer tdk:set-commit-template" - ] + "post-root-package-install": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" }, "repositories": { "typo3-core-packages": { @@ -38,42 +26,7 @@ "require": { "ext-json": "*", "typo3/cms-composer-installers": "^3", - "ochorocho/tdk-composer-plugin": "@dev", - "typo3/cms-extbase": "@dev", - "typo3/cms-belog": "@dev", - "typo3/cms-adminpanel": "@dev", - "typo3/cms-form": "@dev", - "typo3/cms-install": "@dev", - "typo3/cms-filemetadata": "@dev", - "typo3/cms-core": "@dev", - "typo3/cms-frontend": "@dev", - "typo3/cms-felogin": "@dev", - "typo3/cms-linkvalidator": "@dev", - "typo3/cms-setup": "@dev", - "typo3/cms-impexp": "@dev", - "typo3/cms-fluid-styled-content": "@dev", - "typo3/cms-scheduler": "@dev", - "typo3/cms-backend": "@dev", - "typo3/cms-workspaces": "@dev", - "typo3/cms-fluid": "@dev", - "typo3/cms-tstemplate": "@dev", - "typo3/cms-info": "@dev", - "typo3/cms-dashboard": "@dev", - "typo3/cms-recycler": "@dev", - "typo3/cms-redirects": "@dev", - "typo3/cms-extensionmanager": "@dev", - "typo3/cms-filelist": "@dev", - "typo3/cms-t3editor": "@dev", - "typo3/cms-lowlevel": "@dev", - "typo3/cms-beuser": "@dev", - "typo3/cms-rte-ckeditor": "@dev", - "typo3/cms-seo": "@dev", - "typo3/cms-viewpage": "@dev", - "typo3/cms-opendocs": "@dev", - "typo3/cms-sys-note": "@dev", - "typo3/cms-indexed-search": "@dev", - "typo3/cms-reports": "@dev", - "typo3/cms-recordlist": "@dev" + "ochorocho/tdk-composer-plugin": "@dev" }, "require-dev": { "codeception/codeception": "*", From c35b5e0b9f5acb7543971fcf13e99ba86d2dffb9 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:20:22 +0200 Subject: [PATCH 31/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 16e88af..fd6afc7 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -42,6 +42,11 @@ public static function getSubscribedEvents() return [ PackageEvents::POST_PACKAGE_INSTALL => [ ['cloneRepository', 0] + // "composer tdk:git clone", + // "composer tdk:git config", + // "composer tdk:hooks create", + // "composer tdk:ddev", + // "composer tdk:set-commit-template" ], ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ ['ensureRepoExists', 0], @@ -86,7 +91,7 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $this->composerService->requireAllCoreExtensions(); + // $this->composerService->requireAllCoreExtensions(); } } From a8b042a0750ca003deff60db9fa690a684a3dee2 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:33:34 +0200 Subject: [PATCH 32/60] [TASK] TEST Create project --- composer.json | 3 +-- packages/tdk-composer-plugin/src/Plugin.php | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 073bf6c..0c91107 100644 --- a/composer.json +++ b/composer.json @@ -10,8 +10,7 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext", - "post-root-package-install": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" }, "repositories": { "typo3-core-packages": { diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index fd6afc7..a674f94 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -88,10 +88,10 @@ public function cloneRepository(PackageEvent $event): int $filesystem = new Filesystem(); $filesystem->remove([BaseService::CORE_DEV_FOLDER]); - $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); - $this->application->run($input); +// $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); +// $this->application->run($input); - // $this->composerService->requireAllCoreExtensions(); +// $this->composerService->requireAllCoreExtensions(); } } From 3070e142f4020dbc4f02b4e4416dba06164feea4 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:39:27 +0200 Subject: [PATCH 33/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index a674f94..37542e4 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -49,13 +49,13 @@ public static function getSubscribedEvents() // "composer tdk:set-commit-template" ], ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ + ], + ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['ensureRepoExists', 0], ['gitConfig', 0], ['createHooks', 0], ['ddevConfig', 0], ['commitTemplate', 0], - ], - ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['showInformation', 0] ] ]; From 31be0317f70bcf1341d4d11be061aecb2d141306 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:41:58 +0200 Subject: [PATCH 34/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 37542e4..f042f83 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -48,8 +48,8 @@ public static function getSubscribedEvents() // "composer tdk:ddev", // "composer tdk:set-commit-template" ], - ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ - ], +// ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ +// ], ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['ensureRepoExists', 0], ['gitConfig', 0], From 170a27c0cb3040a755d2bb83b9c833b62534a0a1 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:43:23 +0200 Subject: [PATCH 35/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index f042f83..586a36e 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -88,10 +88,10 @@ public function cloneRepository(PackageEvent $event): int $filesystem = new Filesystem(); $filesystem->remove([BaseService::CORE_DEV_FOLDER]); -// $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); -// $this->application->run($input); + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); + $this->application->run($input); -// $this->composerService->requireAllCoreExtensions(); + $this->composerService->requireAllCoreExtensions(); } } From fee4948c7c3ae60f84edc895902824491956f05e Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:47:31 +0200 Subject: [PATCH 36/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 586a36e..877ccb7 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -91,7 +91,7 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $this->composerService->requireAllCoreExtensions(); + // $this->composerService->requireAllCoreExtensions(); } } From b4a4d1a4ce2314c7dadaa24b92eeeeaf6bd4c38a Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:51:17 +0200 Subject: [PATCH 37/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 877ccb7..ae36cbb 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -91,6 +91,8 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); + $event->getComposer()->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, $installDevPackages); + // $this->composerService->requireAllCoreExtensions(); } } From e97e5f148c528b4cb44dde781e81f57fcd0a9991 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 20:53:47 +0200 Subject: [PATCH 38/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index ae36cbb..b89e8ba 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -91,7 +91,7 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $event->getComposer()->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, $installDevPackages); + $event->getComposer()->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, true); // $this->composerService->requireAllCoreExtensions(); } From 6f8015254f87da4449c5cdeb5bdbcab9d8484905 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:00:19 +0200 Subject: [PATCH 39/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index b89e8ba..efa6af1 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -91,8 +91,7 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $event->getComposer()->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, true); - + $event->getComposer()->getEventDispatcher()->dispatchScript('clone-done-event', true); // $this->composerService->requireAllCoreExtensions(); } } From b785d0743b882ef3e5c95faa16b54a2e0583af9d Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:05:00 +0200 Subject: [PATCH 40/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index efa6af1..e1b702e 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -91,8 +91,9 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); + $this->composerService->requireAllCoreExtensions(); + $event->getComposer()->getEventDispatcher()->dispatchScript('clone-done-event', true); - // $this->composerService->requireAllCoreExtensions(); } } From b1f5817153b8e25fae36f0619bc281e5db7a6223 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:10:35 +0200 Subject: [PATCH 41/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index e1b702e..b9af885 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -90,10 +90,10 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); + $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); $this->composerService->requireAllCoreExtensions(); - - $event->getComposer()->getEventDispatcher()->dispatchScript('clone-done-event', true); + $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); } } @@ -150,5 +150,4 @@ public function ensureRepoExists(Event $event): int exec('[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext'); return Command::SUCCESS; } - } From 943e470d7c36739d68d1bdcd6b490e21e9b47197 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:14:02 +0200 Subject: [PATCH 42/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Service/ComposerService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php index 24f5cb9..c305818 100644 --- a/packages/tdk-composer-plugin/src/Service/ComposerService.php +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -31,7 +31,7 @@ public function requireAllCoreExtensions(): int if (count($coreExtensions)) { $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); - return $this->application->run($input); + $this->application->run($input); } return Command::SUCCESS; From 5a13fb52facdde1018aede38ff39ff1ea2cd1f7f Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:20:31 +0200 Subject: [PATCH 43/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 6 +++++- .../tdk-composer-plugin/src/Service/ComposerService.php | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index b9af885..57a9219 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -92,7 +92,11 @@ public function cloneRepository(PackageEvent $event): int $this->application->run($input); $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); - $this->composerService->requireAllCoreExtensions(); + // $this->composerService->requireAllCoreExtensions(); + $coreExtensions = $this->composerService->getCoreExtensions(); + $input = new ArrayInput(array('command' => 'remove', 'packages' => $coreExtensions)); + $this->application->run($input); + $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); } } diff --git a/packages/tdk-composer-plugin/src/Service/ComposerService.php b/packages/tdk-composer-plugin/src/Service/ComposerService.php index c305818..f0cfa78 100644 --- a/packages/tdk-composer-plugin/src/Service/ComposerService.php +++ b/packages/tdk-composer-plugin/src/Service/ComposerService.php @@ -53,7 +53,7 @@ public function getCoreExtensionsFolder(string $path = 'public/typo3/sysext'): F return $this->finder->in($path)->depth(0)->directories(); } - private function getCoreExtensions(string $path = BaseService::CORE_DEV_FOLDER . '/typo3/sysext/'): array + public function getCoreExtensions(string $path = BaseService::CORE_DEV_FOLDER . '/typo3/sysext/'): array { $files = $this->finder->name('composer.json')->in($path)->depth(1)->files(); From 7c7e086d2951fae958cc891726afca1c6290395b Mon Sep 17 00:00:00 2001 From: ochorocho Date: Sun, 25 Sep 2022 21:26:40 +0200 Subject: [PATCH 44/60] [TASK] TEST Create project --- composer.json | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0c91107..dc32917 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,42 @@ "require": { "ext-json": "*", "typo3/cms-composer-installers": "^3", - "ochorocho/tdk-composer-plugin": "@dev" + "ochorocho/tdk-composer-plugin": "@dev", + "typo3/cms-extbase": "@dev", + "typo3/cms-belog": "@dev", + "typo3/cms-adminpanel": "@dev", + "typo3/cms-form": "@dev", + "typo3/cms-install": "@dev", + "typo3/cms-filemetadata": "@dev", + "typo3/cms-core": "@dev", + "typo3/cms-frontend": "@dev", + "typo3/cms-felogin": "@dev", + "typo3/cms-linkvalidator": "@dev", + "typo3/cms-setup": "@dev", + "typo3/cms-impexp": "@dev", + "typo3/cms-fluid-styled-content": "@dev", + "typo3/cms-scheduler": "@dev", + "typo3/cms-backend": "@dev", + "typo3/cms-workspaces": "@dev", + "typo3/cms-fluid": "@dev", + "typo3/cms-tstemplate": "@dev", + "typo3/cms-info": "@dev", + "typo3/cms-dashboard": "@dev", + "typo3/cms-recycler": "@dev", + "typo3/cms-redirects": "@dev", + "typo3/cms-extensionmanager": "@dev", + "typo3/cms-filelist": "@dev", + "typo3/cms-t3editor": "@dev", + "typo3/cms-lowlevel": "@dev", + "typo3/cms-beuser": "@dev", + "typo3/cms-rte-ckeditor": "@dev", + "typo3/cms-seo": "@dev", + "typo3/cms-viewpage": "@dev", + "typo3/cms-opendocs": "@dev", + "typo3/cms-sys-note": "@dev", + "typo3/cms-indexed-search": "@dev", + "typo3/cms-reports": "@dev", + "typo3/cms-recordlist": "@dev" }, "require-dev": { "codeception/codeception": "*", From 20064622db6c350bc93b51222ef44a13db6af894 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 26 Sep 2022 07:34:26 +0200 Subject: [PATCH 45/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 57a9219..49641da 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -94,7 +94,7 @@ public function cloneRepository(PackageEvent $event): int // $this->composerService->requireAllCoreExtensions(); $coreExtensions = $this->composerService->getCoreExtensions(); - $input = new ArrayInput(array('command' => 'remove', 'packages' => $coreExtensions)); + $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); $this->application->run($input); $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); From aa98405e14cf531566d01bd2b99300987eaafa63 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 26 Sep 2022 07:37:16 +0200 Subject: [PATCH 46/60] [TASK] TEST Create project --- composer.json | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/composer.json b/composer.json index dc32917..0c91107 100644 --- a/composer.json +++ b/composer.json @@ -25,42 +25,7 @@ "require": { "ext-json": "*", "typo3/cms-composer-installers": "^3", - "ochorocho/tdk-composer-plugin": "@dev", - "typo3/cms-extbase": "@dev", - "typo3/cms-belog": "@dev", - "typo3/cms-adminpanel": "@dev", - "typo3/cms-form": "@dev", - "typo3/cms-install": "@dev", - "typo3/cms-filemetadata": "@dev", - "typo3/cms-core": "@dev", - "typo3/cms-frontend": "@dev", - "typo3/cms-felogin": "@dev", - "typo3/cms-linkvalidator": "@dev", - "typo3/cms-setup": "@dev", - "typo3/cms-impexp": "@dev", - "typo3/cms-fluid-styled-content": "@dev", - "typo3/cms-scheduler": "@dev", - "typo3/cms-backend": "@dev", - "typo3/cms-workspaces": "@dev", - "typo3/cms-fluid": "@dev", - "typo3/cms-tstemplate": "@dev", - "typo3/cms-info": "@dev", - "typo3/cms-dashboard": "@dev", - "typo3/cms-recycler": "@dev", - "typo3/cms-redirects": "@dev", - "typo3/cms-extensionmanager": "@dev", - "typo3/cms-filelist": "@dev", - "typo3/cms-t3editor": "@dev", - "typo3/cms-lowlevel": "@dev", - "typo3/cms-beuser": "@dev", - "typo3/cms-rte-ckeditor": "@dev", - "typo3/cms-seo": "@dev", - "typo3/cms-viewpage": "@dev", - "typo3/cms-opendocs": "@dev", - "typo3/cms-sys-note": "@dev", - "typo3/cms-indexed-search": "@dev", - "typo3/cms-reports": "@dev", - "typo3/cms-recordlist": "@dev" + "ochorocho/tdk-composer-plugin": "@dev" }, "require-dev": { "codeception/codeception": "*", From 5842850eed207c12e07b72e52601525402d21a93 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 26 Sep 2022 07:56:23 +0200 Subject: [PATCH 47/60] [TASK] TEST Create project --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0c91107..c7cf0b4 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ "repositories": { "typo3-core-packages": { "type": "path", - "url": "typo3-core/typo3/sysext/*" + "url": "typo3-core/typo3/sysext/*", + "canonical": false }, "local-packages": { "type": "path", From 6d3bb09cc98f548c63c5a003e8621d05c9239f8b Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 26 Sep 2022 08:02:02 +0200 Subject: [PATCH 48/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 49641da..5aa2f72 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -90,7 +90,7 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); + // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); // $this->composerService->requireAllCoreExtensions(); $coreExtensions = $this->composerService->getCoreExtensions(); From 3dbe4ee0b878ff42df9df043fccfd2d7c54c9180 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Mon, 26 Sep 2022 08:05:19 +0200 Subject: [PATCH 49/60] [TASK] TEST Create project --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index c7cf0b4..0c91107 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,7 @@ "repositories": { "typo3-core-packages": { "type": "path", - "url": "typo3-core/typo3/sysext/*", - "canonical": false + "url": "typo3-core/typo3/sysext/*" }, "local-packages": { "type": "path", From 8bb506f93aae1b9c461a5b53ef3fef9b93240cc2 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 22:51:17 +0200 Subject: [PATCH 50/60] [TASK] TEST Create project --- composer.json | 39 +++++++++- .../src/Command/GitCommand.php | 4 + packages/tdk-composer-plugin/src/Plugin.php | 77 +++++++------------ 3 files changed, 70 insertions(+), 50 deletions(-) diff --git a/composer.json b/composer.json index 0c91107..247887e 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext" + "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { "typo3-core-packages": { @@ -25,7 +25,42 @@ "require": { "ext-json": "*", "typo3/cms-composer-installers": "^3", - "ochorocho/tdk-composer-plugin": "@dev" + "ochorocho/tdk-composer-plugin": "@dev", + "typo3/cms-extbase": "@dev", + "typo3/cms-belog": "@dev", + "typo3/cms-adminpanel": "@dev", + "typo3/cms-form": "@dev", + "typo3/cms-install": "@dev", + "typo3/cms-filemetadata": "@dev", + "typo3/cms-core": "@dev", + "typo3/cms-frontend": "@dev", + "typo3/cms-felogin": "@dev", + "typo3/cms-linkvalidator": "@dev", + "typo3/cms-setup": "@dev", + "typo3/cms-impexp": "@dev", + "typo3/cms-fluid-styled-content": "@dev", + "typo3/cms-scheduler": "@dev", + "typo3/cms-backend": "@dev", + "typo3/cms-workspaces": "@dev", + "typo3/cms-fluid": "@dev", + "typo3/cms-tstemplate": "@dev", + "typo3/cms-info": "@dev", + "typo3/cms-dashboard": "@dev", + "typo3/cms-recycler": "@dev", + "typo3/cms-redirects": "@dev", + "typo3/cms-extensionmanager": "@dev", + "typo3/cms-filelist": "@dev", + "typo3/cms-t3editor": "@dev", + "typo3/cms-lowlevel": "@dev", + "typo3/cms-beuser": "@dev", + "typo3/cms-rte-ckeditor": "@dev", + "typo3/cms-seo": "@dev", + "typo3/cms-viewpage": "@dev", + "typo3/cms-opendocs": "@dev", + "typo3/cms-sys-note": "@dev", + "typo3/cms-indexed-search": "@dev", + "typo3/cms-reports": "@dev", + "typo3/cms-recordlist": "@dev" }, "require-dev": { "codeception/codeception": "*", diff --git a/packages/tdk-composer-plugin/src/Command/GitCommand.php b/packages/tdk-composer-plugin/src/Command/GitCommand.php index cbe4aee..ebaba7a 100644 --- a/packages/tdk-composer-plugin/src/Command/GitCommand.php +++ b/packages/tdk-composer-plugin/src/Command/GitCommand.php @@ -5,6 +5,10 @@ namespace Ochorocho\TdkComposer\Command; use Composer\Command\BaseCommand; +use Composer\Installer; +use Composer\Plugin\CommandEvent; +use Composer\Plugin\PluginEvents; +use Composer\Semver\Constraint\Constraint; use Ochorocho\TdkComposer\Service\GitService; use Ochorocho\TdkComposer\Service\ValidationService; use Symfony\Component\Console\Command\Command; diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 5aa2f72..796bf9b 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -6,10 +6,7 @@ use Composer\Composer; use Composer\Console\Application; -use Composer\DependencyResolver\Operation\InstallOperation; use Composer\EventDispatcher\EventSubscriberInterface; -use Composer\Installer\PackageEvent; -use Composer\Installer\PackageEvents; use Composer\IO\IOInterface; use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; use Composer\Plugin\Capable as CapableInterface; @@ -17,11 +14,9 @@ use Composer\Script\Event; use Composer\Script\ScriptEvents; use Ochorocho\TdkComposer\Command\CommandProvider; -use Ochorocho\TdkComposer\Service\BaseService; use Ochorocho\TdkComposer\Service\ComposerService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Filesystem\Filesystem; final class Plugin implements PluginInterface, CapableInterface, EventSubscriberInterface { @@ -29,6 +24,8 @@ final class Plugin implements PluginInterface, CapableInterface, EventSubscriber protected Application $application; protected ComposerService $composerService; + protected Composer $composer; + protected IOInterface $io; public function activate(Composer $composer, IOInterface $io) { @@ -40,18 +37,10 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ - PackageEvents::POST_PACKAGE_INSTALL => [ - ['cloneRepository', 0] - // "composer tdk:git clone", - // "composer tdk:git config", - // "composer tdk:hooks create", - // "composer tdk:ddev", - // "composer tdk:set-commit-template" - ], -// ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ +// PluginEvents::PRE_COMMAND_RUN => [ +// ['cloneRepository', 0] // ], ScriptEvents::POST_CREATE_PROJECT_CMD => [ - ['ensureRepoExists', 0], ['gitConfig', 0], ['createHooks', 0], ['ddevConfig', 0], @@ -78,31 +67,31 @@ public function uninstall(Composer $composer, IOInterface $io): void // TODO: Implement uninstall() method. } - public function cloneRepository(PackageEvent $event): int - { - $operation = $event->getOperation(); - if ($operation instanceof InstallOperation) { - $package = $operation->getPackage()->getName(); - - if ($package === self::PACKAGE_NAME) { - $filesystem = new Filesystem(); - $filesystem->remove([BaseService::CORE_DEV_FOLDER]); - - $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); - $this->application->run($input); - // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); - - // $this->composerService->requireAllCoreExtensions(); - $coreExtensions = $this->composerService->getCoreExtensions(); - $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); - $this->application->run($input); - - $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); - } - } - - return Command::SUCCESS; - } +// public function cloneRepository(PackageEvent $event): int +// { +// $operation = $event->getOperation(); +// if ($operation instanceof InstallOperation) { +// $package = $operation->getPackage()->getName(); +// +// if ($package === self::PACKAGE_NAME) { +// $filesystem = new Filesystem(); +// $filesystem->remove([BaseService::CORE_DEV_FOLDER]); +// +// $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); +// $this->application->run($input); +// // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); +// +// // $this->composerService->requireAllCoreExtensions(); +// $coreExtensions = $this->composerService->getCoreExtensions(); +// $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); +// $this->application->run($input); +// +// $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); +// } +// } +// +// return Command::SUCCESS; +// } public function gitConfig(Event $event): int { @@ -146,12 +135,4 @@ public function showInformation(Event $event): int return Command::SUCCESS; } - - public function ensureRepoExists(Event $event): int - { - // $filesystem = new Filesystem(); - // $filesystem->mkdir('typo3-core/typo3/sysext'); - exec('[ -d typo3-core/typo3/sysext ] || mkdir -p typo3-core/typo3/sysext'); - return Command::SUCCESS; - } } From c99b624e1b641f9a3e1c8326cce520208ed2bca9 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 22:55:12 +0200 Subject: [PATCH 51/60] [TASK] TEST Create project --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 247887e..986eff8 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,8 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" + "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", + "post-create-project-cmd": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { "typo3-core-packages": { From 5ae0046dcd9d739c8f8873b7b345ff2275732ffe Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 22:59:38 +0200 Subject: [PATCH 52/60] [TASK] TEST Create project --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 986eff8..5ed225e 100644 --- a/composer.json +++ b/composer.json @@ -10,8 +10,7 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", - "post-create-project-cmd": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" + "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { "typo3-core-packages": { From 581a9ee2acede2d96201cb7d0c2037a9e60460ff Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:05:50 +0200 Subject: [PATCH 53/60] [TASK] TEST Create project --- typo3-core/typo3/sysext/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 typo3-core/typo3/sysext/.gitkeep diff --git a/typo3-core/typo3/sysext/.gitkeep b/typo3-core/typo3/sysext/.gitkeep deleted file mode 100644 index e69de29..0000000 From b45ec804d123c8a9816f276a6a51e9d67c07c90c Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:09:45 +0200 Subject: [PATCH 54/60] [TASK] TEST Create project --- .gitignore | 1 + composer.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 97ac813..f13be9b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ test-acceptance-tdk/ /tests/_support/_generated /.vscode /.php-cs-fixer.cache +/typo3-core \ No newline at end of file diff --git a/composer.json b/composer.json index 5ed225e..1e139d6 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { - "typo3-core-packages": { + "pre-update-cmd": { "type": "path", "url": "typo3-core/typo3/sysext/*" }, From 8127b6346ba662ab8ad02dc1bfe0ac3de2dd8d26 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:14:18 +0200 Subject: [PATCH 55/60] [TASK] TEST Create project --- composer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1e139d6..be294c0 100644 --- a/composer.json +++ b/composer.json @@ -10,10 +10,12 @@ } ], "scripts": { - "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" + "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", + "pre-install-cmd": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", + "post-root-package-install": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { - "pre-update-cmd": { + "typo3-core-packages": { "type": "path", "url": "typo3-core/typo3/sysext/*" }, From 46b4e5b00f81704cd49c407992cf77462ee8f133 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:38:36 +0200 Subject: [PATCH 56/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 55 ++++++++++----------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 796bf9b..7945732 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -6,6 +6,7 @@ use Composer\Composer; use Composer\Console\Application; +use Composer\DependencyResolver\Operation\InstallOperation; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability; @@ -37,9 +38,9 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ -// PluginEvents::PRE_COMMAND_RUN => [ -// ['cloneRepository', 0] -// ], + ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ + ['cloneRepository', 0] + ], ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['gitConfig', 0], ['createHooks', 0], @@ -67,31 +68,29 @@ public function uninstall(Composer $composer, IOInterface $io): void // TODO: Implement uninstall() method. } -// public function cloneRepository(PackageEvent $event): int -// { -// $operation = $event->getOperation(); -// if ($operation instanceof InstallOperation) { -// $package = $operation->getPackage()->getName(); -// -// if ($package === self::PACKAGE_NAME) { -// $filesystem = new Filesystem(); -// $filesystem->remove([BaseService::CORE_DEV_FOLDER]); -// -// $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); -// $this->application->run($input); -// // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); -// -// // $this->composerService->requireAllCoreExtensions(); -// $coreExtensions = $this->composerService->getCoreExtensions(); -// $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); -// $this->application->run($input); -// -// $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); -// } -// } -// -// return Command::SUCCESS; -// } + public function cloneRepository(PackageEvent $event): int + { + $operation = $event->getOperation(); + if ($operation instanceof InstallOperation) { + $package = $operation->getPackage()->getName(); + + if ($package === self::PACKAGE_NAME) { + + $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); + $this->application->run($input); + // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); + + // $this->composerService->requireAllCoreExtensions(); + // $coreExtensions = $this->composerService->getCoreExtensions(); + // $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); + // $this->application->run($input); + + $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); + } + } + + return Command::SUCCESS; + } public function gitConfig(Event $event): int { From 36573f262f0209e0a0877e4a9e89f521d9bda24d Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:43:03 +0200 Subject: [PATCH 57/60] [TASK] TEST Create project --- composer.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/composer.json b/composer.json index be294c0..247887e 100644 --- a/composer.json +++ b/composer.json @@ -10,9 +10,7 @@ } ], "scripts": { - "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", - "pre-install-cmd": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core", - "post-root-package-install": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" + "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { "typo3-core-packages": { From 2e1871ea100f5a51f2fb2b6ac3aaae08c9ab9468 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Wed, 28 Sep 2022 23:55:47 +0200 Subject: [PATCH 58/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 7945732..86bf5c1 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -38,9 +38,9 @@ public function activate(Composer $composer, IOInterface $io) public static function getSubscribedEvents() { return [ - ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ - ['cloneRepository', 0] - ], +// ScriptEvents::POST_ROOT_PACKAGE_INSTALL => [ +// ['cloneRepository', 0] +// ], ScriptEvents::POST_CREATE_PROJECT_CMD => [ ['gitConfig', 0], ['createHooks', 0], From 36eb56935c1effb7b94569c89edee7e31974bb65 Mon Sep 17 00:00:00 2001 From: ochorocho Date: Thu, 29 Sep 2022 00:11:30 +0200 Subject: [PATCH 59/60] [TASK] TEST Create project --- packages/tdk-composer-plugin/src/Plugin.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/tdk-composer-plugin/src/Plugin.php b/packages/tdk-composer-plugin/src/Plugin.php index 86bf5c1..3de5101 100644 --- a/packages/tdk-composer-plugin/src/Plugin.php +++ b/packages/tdk-composer-plugin/src/Plugin.php @@ -78,12 +78,6 @@ public function cloneRepository(PackageEvent $event): int $input = new ArrayInput(array('command' => 'tdk:git', 'action' => 'clone')); $this->application->run($input); - // $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-clone-done', true); - - // $this->composerService->requireAllCoreExtensions(); - // $coreExtensions = $this->composerService->getCoreExtensions(); - // $input = new ArrayInput(array('command' => 'require', 'packages' => $coreExtensions)); - // $this->application->run($input); $event->getComposer()->getEventDispatcher()->dispatchScript('typo3-require-done', true); } From 24ccce034f6404f7241750d406a56a36bf99198e Mon Sep 17 00:00:00 2001 From: ochorocho Date: Thu, 29 Sep 2022 00:14:16 +0200 Subject: [PATCH 60/60] [TASK] TEST Create project --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 247887e..5ed225e 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ } ], "scripts": { - "command": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" + "pre-command-run": "[ -d typo3-core/typo3/sysext ] || git clone https://github.com/TYPO3/typo3.git typo3-core" }, "repositories": { "typo3-core-packages": {