diff --git a/README.md b/README.md index af2f1c3..dfe6e1a 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ MS_GITHUB_TOKEN=abc123 php run.php update --cms-major=5 --branch=next-minor --dr | --dry-run | Do not push to github or create pull-requests | | --account | GitHub account to use for creating pull-requests (default: creative-commoners) | | --no-delete | Do not delete `_data` and `_modules` directories before running | +| --unsupported | Only update unsupported modules that were supported in the previous CMS major. Must also use `--branch=default-branch`. Can not be used with `--cms-major` option. | | --update-prs | Update existing open PRs instead of creating new PRs | **Note** that using `--branch=github-default` will only run scripts in the `scripts/default-branch` directory. diff --git a/funcs_scripts.php b/funcs_scripts.php index 1fe20a6..2f84594 100644 --- a/funcs_scripts.php +++ b/funcs_scripts.php @@ -138,6 +138,20 @@ function module_is_recipe() return ($json->type ?? '') === 'silverstripe-recipe'; } +/** + * Determine if the module being processed is supported for the current $CMS_MAJOR + * + * Example usage: + * module_is_supported() + */ +function module_is_supported() +{ + global $GITHUB_REF, $CMS_MAJOR; + $repoMetaData = MetaData::getMetaDataForRepository($GITHUB_REF); + $metaData = MetaData::removeReposNotInCmsMajor([$repoMetaData], $CMS_MAJOR); + return count($metaData) > 0; +} + /** * Determine if the repository being processed is an actual silverstripe module e.g. silverstripe-admin, not gha-* * diff --git a/funcs_utils.php b/funcs_utils.php index edccfa6..ce18529 100644 --- a/funcs_utils.php +++ b/funcs_utils.php @@ -380,6 +380,24 @@ function filtered_modules($cmsMajor, $input) $cmsMajor === MetaData::HIGHEST_STABLE_CMS_MAJOR ); + if ($input->getOption('unsupported')) { + $prevCmsMajor = $cmsMajor - 1; + $prevCmsRepos = MetaData::removeReposNotInCmsMajor( + MetaData::getAllRepositoryMetaData(false), + $prevCmsMajor, + false + ); + $repoGithubs = array_map(fn($repo) => $repo['github'], $repos); + $unsupportedRepos = []; + foreach ($prevCmsRepos as $prevCmsRepo) { + if (in_array($prevCmsRepo['github'], $repoGithubs)) { + continue; + } + $unsupportedRepos[] = $prevCmsRepo; + } + $repos = $unsupportedRepos; + } + $modules = convert_repos_data_to_modules($repos); if ($input->getOption('only')) { diff --git a/run.php b/run.php index 1222dc0..6e99397 100644 --- a/run.php +++ b/run.php @@ -27,6 +27,7 @@ const TAG_RULESET_NAME = 'Silverstripe CMS tag ruleset'; // global variables +$CMS_MAJOR = ''; $MODULE_DIR = ''; $GITHUB_REF = ''; $PRS_CREATED = []; @@ -80,6 +81,12 @@ InputOption::VALUE_NONE, 'Do not delete _data and _modules directories before running' ]; +$optionUnsupported = [ + 'unsupported', + null, + InputOption::VALUE_NONE, + 'Only update unsupported modules that were supported in the previous CMS major. Must also use --branch=default-branch. Can not be used with --cms-major option.' +]; $optionUpdatePrs = [ 'update-prs', null, @@ -98,6 +105,7 @@ ->addOption(...$optionDryRun) ->addOption(...$optionAccount) ->addOption(...$optionNoDelete) + ->addOption(...$optionUnsupported) ->addOption(...$optionUpdatePrs) ->setCode($updateCommand); diff --git a/scripts/default-branch/readme.php b/scripts/default-branch/readme.php new file mode 100644 index 0000000..0aa0548 --- /dev/null +++ b/scripts/default-branch/readme.php @@ -0,0 +1,8 @@ +getOption('unsupported') && $input->getOption('branch') !== 'github-default') { + error('The --unsupported option must be used with --branch=github-default'); + } + + // unsupported option must not be used with cms-major option + if ($input->getOption('unsupported') && $input->getOption('cms-major')) { + error('The --unsupported option must not be used with the --cms-major option'); + } + // branch $branchOption = $input->getOption('branch') ?: DEFAULT_BRANCH; if (!in_array($branchOption, BRANCH_OPTIONS)) { @@ -25,10 +35,10 @@ } // CMS major version to use - $cmsMajor = $input->getOption('cms-major') ?: MetaData::HIGHEST_STABLE_CMS_MAJOR; + $CMS_MAJOR = $input->getOption('cms-major') ?: MetaData::HIGHEST_STABLE_CMS_MAJOR; // modules - $modules = filtered_modules($cmsMajor, $input); + $modules = filtered_modules($CMS_MAJOR, $input); // script files if ($branchOption === 'github-default') { @@ -36,7 +46,7 @@ } else { $scriptFiles = array_merge( script_files('any'), - script_files($cmsMajor), + script_files($CMS_MAJOR), ); } @@ -131,7 +141,7 @@ $defaultBranch, $currentBranch, $currentBranchCmsMajor, - $cmsMajor, + $CMS_MAJOR, $branchOption ); } @@ -142,8 +152,8 @@ cmd("git checkout $branchToCheckout", $MODULE_DIR); // ensure that this branch actually supports the cmsMajor we're targetting - if (!$useDefaultBranch && $branchOption !== 'github-default' && current_branch_cms_major() !== $cmsMajor) { - error("Branch $branchToCheckout does not support CMS major version $cmsMajor"); + if (!$useDefaultBranch && $branchOption !== 'github-default' && current_branch_cms_major() !== $CMS_MAJOR) { + error("Branch $branchToCheckout does not support CMS major version $CMS_MAJOR"); } // create a new branch used for the pull-request