Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

WIP: Modulize OpenMage #4618

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 224 additions & 0 deletions .ddev/commands/web/openmage-mono
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
#!/bin/bash

## ProjectTypes: magento
## Description: downloads all modules from openmage-strict to .localdev
## Usage: openmage-mono [-c|--commit] [-d|--download] [-g|--generate]
## Example: ddev ddev openmage-mono -c -d -g -p -t
## Flags: [{"Name":"commit","Shorthand":"c","Usage":"commit changes"},{"Name":"download","Shorthand":"d","Usage":"download modules"},{"Name":"generate","Shorthand":"g","Usage":"generate modules"}

declare -A modules

modules["Mage_Admin"]="module-admin"
modules["Mage_AdminNotification"]="module-admin-notification"
modules["Mage_Adminhtml"]="module-adminhtml"
modules["Mage_Api"]="module-api"
modules["Mage_Api2"]="module-api2"
modules["Mage_Authorizenet"]="module-authorizenet"
modules["Mage_Bundle"]="module-bundle"
modules["Mage_Captcha"]="module-captcha"
modules["Mage_Catalog"]="module-catalog"
modules["Mage_CatalogIndex"]="module-catalog-index"
modules["Mage_CatalogInventory"]="module-catalog-inventory"
modules["Mage_CatalogRule"]="module-catalog-rule"
modules["Mage_CatalogSearch"]="module-catalog-search"
modules["Mage_Centinel"]="module-centinel"
modules["Mage_Checkout"]="module-checkout"
modules["Mage_Cms"]="module-cms"
modules["Mage_ConfigurableWwatches"]="module-configurable-swatches"
modules["Mage_Contacts"]="module-contacts"
modules["Mage_Core"]="module-core"
modules["Mage_Cron"]="module-cron"
modules["Mage_CurrencySymbol"]="module-currency-symbol"
modules["Mage_Customer"]="module-customer"
modules["Mage_Dataflow"]="module-dataflow"
modules["Mage_Directory"]="module-directory"
modules["Mage_Downloadable"]="module-downloadable"
modules["Mage_Eav"]="module-eav"
modules["Mage_GiftMessage"]="module-gift-message"
modules["Mage_GoogleAnalytics"]="module-google-analytics"
modules["Mage_GoogleCheckout"]="module-google-checkout"
modules["Mage_ImportExport"]="module-import-export"
modules["Mage_Index"]="module-index"
modules["Mage_Install"]="module-install"
modules["Mage_Log"]="module-log"
modules["Mage_Media"]="module-media"
modules["Mage_Newsletter"]="module-newsletter"
modules["Mage_Oauth"]="module-oauth"
modules["Mage_Page"]="module-page"
modules["Mage_Paygate"]="module-paygate"
modules["Mage_Payment"]="module-payment"
modules["Mage_Paypal"]="module-paypal"
modules["Mage_PaypalUk"]="module-paypal-uk"
modules["Mage_Persistent"]="module-persistent"
modules["Mage_ProductAlert"]="module-product-alert"
modules["Mage_Rating"]="module-rating"
modules["Mage_Report"]="module-reports"
modules["Mage_Review"]="module-review"
modules["Mage_Rss"]="module-rss"
modules["Mage_Rule"]="module-rule"
modules["Mage_Sales"]="module-sales"
modules["Mage_SalesRule"]="module-sales-rule"
modules["Mage_Sendfriend"]="module-sendfriend"
modules["Mage_Shipping"]="module-shipping"
modules["Mage_Sitemap"]="module-sitemap"
modules["Mage_Tag"]="module-tag"
modules["Mage_Tax"]="module-tax"
modules["Mage_Uploader"]="module-uploader"
modules["Mage_Usa"]="module-usa"
modules["Mage_Wee"]="module-weee"
modules["Mage_Widget"]="module-widget"
modules["Mage_Wishlist"]="module-wishlist"
#modules["Dev_Test"]="dev-module"

ROOT="${PWD}"

COMMIT_FLAG=''
DOWNLOAD_FLAG=''
GENERAT_FLAG=''
PUSH_FLAG=''
REVERT_FLAG=''
TAG_FLAG=''

while :; do
case ${1:-} in
-c|--commit)
COMMIT_FLAG='true' ;;
-d|--download)
DOWNLOAD_FLAG='true' ;;
-g|--generate)
GENERAT_FLAG='true' ;;
-p|--push)
PUSH_FLAG='true' ;;
-r|--revert)
REVERT_FLAG='true' ;;
-t|--tag)
TAG_FLAG='true' ;;
--) # End of all options.
shift
break
;;
-?*)
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
;;
*) # Default case: No more options, so break out of the loop.
break
esac

shift
done

if [ ! -d ".localdev/" ]
then
mkdir ".localdev/"
echo "Directory created."
fi

if ! grep -q "./.localdev/*" composer.json; then
php vendor/bin/composer config repositories.local '{"type": "path", "url": "./.localdev/*", "canonical": false}'
echo "Patched composer.json."
fi

cd ".localdev/" || exit

if [[ "${COMMIT_FLAG}" || "${TAG_FLAG}" ]]; then
read -r -p "Commit message[update]: " MESSAGE
MESSAGE=${MESSAGE:-update}
fi

if [[ "${TAG_FLAG}" ]]; then
read -r -p "Tag: " TAG
TAG=${TAG}
fi

for class in ${!modules[@]}; do
cd "${modules[${class}]}" || exit

if [[ "${COMMIT_FLAG}" ]]; then
echo "Add commit message to ${modules[${class}]}."
git add .
git commit -m "${MESSAGE}"

if [[ "${TAG_FLAG}" ]]; then
echo "Add tag to ${modules[${class}]}."
git tag "${TAG}" HEAD -m "${TAG}"
fi
fi

if [[ "${PUSH_FLAG}" ]]; then
echo "Push ${modules[${class}]}."
git push
fi

if [[ "${REVERT_FLAG}" ]]; then
echo "Revert last commit in ${modules[${class}]}."
git commit -m "Revert last commit"
git reset HEAD~
git add .
git commit -c ORIG_HEAD
fi

cd ..

if [[ "${DOWNLOAD_FLAG}" ]]; then
# create directory
if ! [ -d "${modules[${class}]}" ]; then
echo "Create ${modules[${class}]} directoy."
mkdir -p "${modules[${class}]}"
fi

# clone repo
if ! [ -d "${modules[${class}]}/.git" ]; then
echo "Clone ${modules[${class}]} repo."
cd "${modules[${class}]}" || exit
git clone "https://github.com/openmage-strict/${modules[${class}]}.git" .
cd ..
fi
fi

if [[ "${GENERAT_FLAG}" ]]; then
# add basic files (if needed)
if ! [ -d "${modules[${class}]}/src" ]; then
echo "Copy blueprint to ${modules[${class}]}."
cp -r dev-module-template/* "${modules[${class}]}/"
fi

# add FUNDING.yml
if ! [ -d "${modules[${class}]}/.github" ]; then
mkdir -p "${modules[${class}]}/.github"

if ! [ -f "${modules[${class}]}/github/FUNDING.yml" ]; then
echo "Copy blueprint FUNDING.yml to ${modules[${class}]}."
cp -f dev-module-template/.github/FUNDING.yml "${modules[${class}]}/.github/FUNDING.yml"
fi
fi

# require PHPMD
if ! [ -f "${modules[${class}]}/.phpmd.dist.xml" ]; then
echo "Add PHPMD to ${modules[${class}]} repo."
cd "${modules[${class}]}" || exit
composer require --dev phpmd/phpmd
cp -f dev-module-template/.phpmd.dist.xml "${modules[${class}]}/.phpmd.dist.xml"
cd ..
fi

# add README.md
if ! [ -f "${modules[${class}]}/README.md" ]; then
echo "Add README.md to ${modules[${class}]}."
#rm -f "${modules[${class}]}/README.md"
cat <<EOT >> "${modules[${class}]}/README.md"
# Module \`${class}\`

An [OpenMage][1] core module.

## Install

\`\`\` bash
composer require openmage-strict/${modules[${class}]}
\`\`\`

[1]: https://github.com/OpenMage/magento-lts
EOT

fi
fi
done
11 changes: 10 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@
],
"autoload-dev": {
"psr-4": {
"OpenMage\\Tests\\Unit\\": "tests/unit"
"OpenMage\\Tests\\Unit\\": "tests/unit",
"OpenMage\\Dev\\Mono\\": "dev/mono"
}
},
"extra": {
Expand Down Expand Up @@ -156,6 +157,7 @@
"phpunit:coverage-local": "XDEBUG_MODE=coverage php vendor/bin/phpunit --configuration .phpunit.dist.xml --coverage-html build/coverage",
"rector:test": "vendor/bin/rector process --config .rector.php --dry-run",
"rector:fix": "vendor/bin/rector --config .rector.php process",
"mono-repo:copy": "OpenMage\\Dev\\Mono\\CopyToMonoRepos::process",
"test": [
"@php-cs-fixer:test",
"@phpstan",
Expand All @@ -174,5 +176,12 @@
"rector:test": "Run rector",
"rector:fix": "Run rector and fix issues",
"test": "Run php-cs-fixer, phpstan & phpunit"
},
"repositories": {
"local": {
"type": "path",
"url": "./.localdev/*",
"canonical": false
}
}
}
2 changes: 1 addition & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

120 changes: 120 additions & 0 deletions dev/mono/CopyToMonoRepos.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

namespace OpenMage\Dev\Mono;

use Exception;
use Mage_Core_Model_Config;
use Symfony\Component\Filesystem\Filesystem;

defined('DS') || define('DS', DIRECTORY_SEPARATOR);
defined('PS') || define('PS', PATH_SEPARATOR);

class CopyToMonoRepos
{
public const MODMAN_FILE = 'modman';
public const TYPE_SOURCE = 'source';
public const TYPE_TARGET = 'target';

private Filesystem $filesystem;
private string $modmanFile;
private ?string $copyTarget;

public function __construct(string $pathToModmanFile, ?string $copyTarget)
{
$this->copyTarget = $copyTarget;
$this->filesystem = new Filesystem();
$this->modmanFile = $pathToModmanFile;
}

public static function process(): void
{
foreach (self::getModules() as $module) {
$modman = new CopyToMonoRepos(
sprintf('.localdev/%s', $module),
sprintf('.localdev/%s/src', $module),
);
$modman->copyMappedFiles();
}
}

public function copyMappedFiles()
{
$targets = $this->getModmanMapping(self::TYPE_TARGET);
foreach ($targets as $target) {
if ($this->filesystem->exists($target)) {
if (is_dir($target)) {
$this->filesystem->mkdir($this->copyTarget);
$this->filesystem->mirror($target, $this->copyTarget . DS . $target, null, ['override' => true]);
} else {
$this->filesystem->copy($target, $this->copyTarget . DS . $target, true);
}
}
}
}

/**
* @param self::TYPE_*|null $type
*/
public function getModmanMapping(?string $type = null): array
{
$mapped = [];

try {
$content = $this->getModmanFileContent();
$parts = preg_split('/\s+/', $content);


foreach ($parts as $index => $path) {
if (!$path) {
continue;
}
if ($index % 2 == 0) {
$mapped[self::TYPE_SOURCE][] = $path;
} else {
$mapped[self::TYPE_TARGET][] = $path;
}
}

if (!is_null($type)) {
return $mapped[$type];
}
} catch (Exception $exception) {
echo $exception->getMessage() . PHP_EOL;
}

return $mapped;
}

public function getModmanFilePath(): string
{
return getcwd() . DS . $this->modmanFile . DS . self::MODMAN_FILE;
}

/**
* @throws Exception
*/
public function getModmanFileContent(): string
{
$file = $this->getModmanFilePath();
if ($this->filesystem->exists($file)) {
$content = file_get_contents($file);
if (!$content) {
return '';
}
return $content;
}
throw new Exception(sprintf('File %s not found.', $file));
}

public static function getModules(): array
{
$modules = [];
foreach (array_keys(Mage_Core_Model_Config::MAGE_MODULES) as $module) {
$string = str_replace('Mage_', 'module', $module);
$data = preg_split('/(?=[A-Z])/', $string);
$string = implode('-', $data);
$modules[$module] = strtolower($string);
}
return $modules;
}
}
Loading