Skip to content

Commit

Permalink
Merge branch 'main' into task/gitpod-optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
ochorocho committed Sep 3, 2022
2 parents fb7c01f + 0c5df57 commit fa4fe79
Show file tree
Hide file tree
Showing 7 changed files with 221 additions and 220 deletions.
95 changes: 7 additions & 88 deletions Scripts/BaseScript.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,101 +4,20 @@

namespace Ochorocho\Tdk\Scripts;

use Composer\Downloader\TransportException;
use Composer\Script\Event;
use Composer\Util\HttpDownloader;

abstract class BaseScript
{
protected static string $coreDevFolder = 'typo3-core';

/**
* Get 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
protected static function getArguments($array): array
{
if ($version = getenv('TDK_PHP_VERSION')) {
return $version;
}

if ($jsonPath === '') {
$jsonPath = self::$coreDevFolder . '/composer.json';
}
$items = [];
foreach ($array as $argument) {
preg_match('/^--(.*)/', $argument, $parsed);

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];
$key = explode('=', $parsed[1] ?? '');
$items[$key[0]] = $key[1] ?? true;
}

return '8.1';
}

/**
* @return \Closure
*/
protected static function validateDdevProjectName(): \Closure
{
return function ($value) {
if (!preg_match('/^[a-zA-Z0-9_-]*$/', trim($value))) {
throw new \UnexpectedValueException('Invalid ddev project name "' . $value . '"');
}

return trim($value);
};
}

/**
* @return \Closure
*/
protected static function validateFilePath(): \Closure
{
return function ($value) {
if (!is_file($value)) {
throw new \UnexpectedValueException('Invalid file path "' . $value . '"');
}

return $value;
};
}

/**
* @param Event $event
* @return \Closure
*/
protected static function validateUsername(Event $event): \Closure
{
return function ($value) use ($event) {
try {
$userData = self::getGerritUserData($event, $value);
} catch (TransportException $exception) {
throw new \UnexpectedValueException('Username "' . $value . '" 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);
return $items;
}
}
114 changes: 5 additions & 109 deletions Scripts/InitializeScript.php → Scripts/CommonScript.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,98 +6,20 @@

use Composer\Script\Event;
use Composer\Util\ProcessExecutor;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;

class InitializeScript extends BaseScript
class CommonScript extends BaseScript
{
public static function enableHooks(Event $event)
{
$questions = [
[
'method' => 'enableCommitMessageHook',
'message' => 'Setup Commit Message Hook? [<fg=cyan;options=bold>y</>/n] ',
'default' => true
],
[
'method' => 'enablePreCommitHook',
'message' => 'Setup Pre Commit Hook? [<fg=cyan;options=bold>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 removeHooks(Event $event)
{
$filesystem = new Filesystem();
$filesystem->remove([
self::$coreDevFolder . '/.git/hooks/pre-commit',
self::$coreDevFolder . '/.git/hooks/commit-msg',
]);
}

private static function enableCommitMessageHook(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('<info>Created Commit Message Hook</info>');
} catch (IOException $e) {
$event->getIO()->writeError('<warning>Exception:enableCommitMessageHook:' . $e->getMessage() . '</warning>');
}
}

private static function enablePreCommitHook(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('<info>Created Pre Commit Hook</info>');
} catch (IOException $e) {
$event->getIO()->writeError('<warning>Exception:enablePreCommitHook:' . $e->getMessage() . '</warning>');
}
}

public static function createDdevConfig(Event $event)
{
// Only ask for ddev config if ddev command is available
$windows = strpos(PHP_OS, 'WIN') === 0;
$test = $windows ? 'where' : 'command -v';

if (is_executable(trim(shell_exec($test . ' ddev') ?? ''))) {
$ddevProjectName = GitScript::getArguments($event->getArguments())['project-name'] ?? getenv('TDK_CREATE_DDEV_PROJECT_NAME') ?? false;
$ddevProjectName = self::getArguments($event->getArguments())['project-name'] ?? getenv('TDK_CREATE_DDEV_PROJECT_NAME') ?? false;
if (!$ddevProjectName) {
$skip = isset(GitScript::getArguments($event->getArguments())['no']) ?? false;
$skip = isset(self::getArguments($event->getArguments())['no']) ?? false;
if ($skip) {
$createConfig = false;
} else {
Expand All @@ -110,7 +32,7 @@ public static function createDdevConfig(Event $event)
}
}

$validator = self::validateDdevProjectName();
$validator = ValidatorScript::projectName();

if (!$ddevProjectName) {
$defaultProjectName = basename(getcwd());
Expand Down Expand Up @@ -144,7 +66,7 @@ public static function removeFilesAndFolders(Event $event): void
'var',
];

$force = GitScript::getArguments($event->getArguments())['force'] ?? false;
$force = self::getArguments($event->getArguments())['force'] ?? false;

if ($force) {
$answer = true;
Expand All @@ -159,32 +81,6 @@ public static function removeFilesAndFolders(Event $event): void
}
}

public static function showSummary(Event $event): void
{
$coreFolder = self::$coreDevFolder;
$summary = <<<EOF
💡For more Details read the docs:
* Setting up Gerrit (ssh):
https://docs.typo3.org/m/typo3/guide-contributionworkflow/master/en-us/Account/GerritAccount.html
* Git Setup:
https://docs.typo3.org/m/typo3/guide-contributionworkflow/master/en-us/Setup/Git/Index.html
* Setup your IDE:
https://docs.typo3.org/m/typo3/guide-contributionworkflow/master/en-us/Setup/SetupIde.html
* runTests.sh docs still apply, but don't forget to cd into '$coreFolder':
https://docs.typo3.org/m/typo3/guide-contributionworkflow/master/en-us/Testing/Index.html
<fg=yellow;options=bold>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('<info>🎉 Happy days ... TYPO3 Composer CoreDev Setup done!</info>');
}

public static function doctor(Event $event): void
{
$filesystem = new Filesystem();
Expand Down
18 changes: 2 additions & 16 deletions Scripts/GitScript.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class GitScript extends BaseScript
public static function setGitConfig(Event $event)
{
$arguments = self::getArguments($event->getArguments());
$validator = self::validateUsername($event);
$validator = ValidatorScript::username($event);

$username = $arguments['username'] ?? getenv('TDK_USERNAME') ?? false;
if ($username === 'none') {
Expand All @@ -37,7 +37,7 @@ public static function setGitConfig(Event $event)
public static function setCommitTemplate(Event $event)
{
$arguments = self::getArguments($event->getArguments());
$validator = self::validateFilePath();
$validator = ValidatorScript::filePath();

if ($arguments['file'] ?? false) {
$file = $validator($arguments['file']);
Expand Down Expand Up @@ -118,20 +118,6 @@ public static function checkoutBranch(Event $event)
return 0;
}

// @todo: Move to BaseScript?
public static function getArguments($array): array
{
$items = [];
foreach ($array as $argument) {
preg_match('/^--(.*)/', $argument, $parsed);

$key = explode('=', $parsed[1] ?? '');
$items[$key[0]] = $key[1] ?? true;
}

return $items;
}

private static function setGitConfigValue(Event $event, string $config, string $value): void
{
$process = new ProcessExecutor();
Expand Down
89 changes: 89 additions & 0 deletions Scripts/HookScript.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

declare(strict_types=1);

namespace Ochorocho\Tdk\Scripts;

use Composer\Script\Event;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;

class HookScript extends BaseScript
{
public static function enable(Event $event)
{
$questions = [
[
'method' => 'enableCommitMessage',
'message' => 'Setup Commit Message Hook? [<fg=cyan;options=bold>y</>/n] ',
'default' => true
],
[
'method' => 'enablePreCommit',
'message' => 'Setup Pre Commit Hook? [<fg=cyan;options=bold>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('<info>Created Commit Message Hook</info>');
} catch (IOException $e) {
$event->getIO()->writeError('<warning>Exception:enableCommitMessageHook:' . $e->getMessage() . '</warning>');
}
}

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('<info>Created Pre Commit Hook</info>');
} catch (IOException $e) {
$event->getIO()->writeError('<warning>Exception:enablePreCommitHook:' . $e->getMessage() . '</warning>');
}
}
}
Loading

0 comments on commit fa4fe79

Please sign in to comment.