Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

ENH Update reference to supported modules data #117

Merged
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ generated through [Doctum](https://github.com/code-lts/doctum#readme).
### Add a new major ersion

* Add a new version in the `'versions'` key in `conf/doctum.json`
* Make sure https://github.com/silverstripe/supported-modules has been updated with a new branch for the new major version with correct branch mapping
* Make sure https://github.com/silverstripe/supported-modules has been updated with correct branch mapping
* Run `makedoc.sh` and confirm the generation runs through properly
* Make a commit of the updated `conf/doctum.json`
* Update the redirections in `.htaccess` to the stable version number (if releasing a new stable major version)
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"require": {
"php": "^8.1",
"gitonomy/gitlib": "^1.2",
"silverstripe/supported-modules": "dev-main",
"symfony/console": "^6.2",
"code-lts/doctum": "^5.5.3",
"psr/log": "^3.0"
Expand Down
126 changes: 123 additions & 3 deletions composer.lock

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

60 changes: 50 additions & 10 deletions src/Console/CheckoutCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use RuntimeException;
use SilverStripe\ApiDocs\Data\Config;
use SilverStripe\ApiDocs\Data\RepoFactory;
use SilverStripe\SupportedModules\MetaData;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
Expand All @@ -17,6 +18,7 @@ class CheckoutCommand extends Command
/**
* Regex patterns for github repositories that should be ignored.
* These are repositories that don't have relevant API.
* The patterns are matched against the packagist name for the module.
*/
private array $ignoreModulePatterns = [
'/^silverstripe\/developer-docs$/',
Expand Down Expand Up @@ -162,21 +164,43 @@ private function buildVersionMap(array $config, OutputInterface $output)
$map = [];
$versions = array_keys($config['versions']);

foreach ($versions as $version) {
$modulesUrl = "https://raw.githubusercontent.com/silverstripe/supported-modules/$version/modules.json";
$repos = MetaData::getAllRepositoryMetaData()[MetaData::CATEGORY_SUPPORTED];
foreach ($repos as $repo) {
if ($this->shouldIgnoreModule($repo)) {
continue;
}
$githubName = $repo['github'];
$moduleName = $repo['packagist'];
$versionMap = $repo['majorVersionMapping'];
// Remove mapping from any versions we don't care about, and make sure we only have one branch for each cms major
foreach ($versionMap as $cmsMajor => $branches) {
if (!in_array($cmsMajor, $versions)) {
unset($versionMap[$cmsMajor]);
continue;
}
$versionMap[$cmsMajor] = end($branches);
}
$map[$moduleName] = [
'repository' => "https://github.com/$githubName.git",
'versionmap' => $versionMap,
];
}

// CMS 3 isn't in the main branch of silverstripe/supported-modules - we have to use a legacy branch for that data.
if (in_array(3, $versions)) {
$modulesUrl = "https://raw.githubusercontent.com/silverstripe/supported-modules/3/modules.json";
$modulesJson = json_decode(file_get_contents($modulesUrl) ?: 'null', true);

if ($modulesJson === null) {
throw new RuntimeException('Modules data could not be retrieved for version ' . $version);
throw new RuntimeException('Modules data could not be retrieved for version 3');
}

foreach ($modulesJson as $module) {
$moduleName = $module['composer'];

if ($this->shouldIgnoreModule($module)) {
if ($this->shouldIgnoreModuleLegacy($module, true)) {
continue;
}

$moduleName = $module['composer'];
if (!array_key_exists($moduleName, $map)) {
$githubName = $module['github'];
$map[$moduleName] = [
Expand All @@ -187,22 +211,23 @@ private function buildVersionMap(array $config, OutputInterface $output)

$branches = $module['branches'];
sort($branches);
$map[$moduleName]['versionmap'][$version] = end($branches);
$map[$moduleName]['versionmap'][3] = end($branches);
}
}

foreach ($map as &$data) {
// Add a null entry for anything that's not supported for a given version
foreach ($map as $index => $data) {
foreach ($versions as $version) {
if (!isset($data['versionmap'][$version])) {
$data['versionmap'][$version] = null;
$map[$index]['versionmap'][$version] = null;
}
}
}

return $map;
}

private function shouldIgnoreModule(array $module)
private function shouldIgnoreModuleLegacy(array $module)
{
if ($module['type'] !== 'supported-module' || empty($module['branches'])) {
return true;
Expand All @@ -216,4 +241,19 @@ private function shouldIgnoreModule(array $module)

return false;
}

private function shouldIgnoreModule(array $module)
{
if ($module['type'] === 'other' || empty($module['majorVersionMapping'])) {
return true;
}

foreach ($this->ignoreModulePatterns as $regex) {
if (preg_match($regex, $module['packagist'])) {
return true;
}
}

return false;
}
}
Loading