diff --git a/README.md b/README.md index c5e01bf..73aaeb6 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ List of files to search for prerequisites. Supported formats are: Defaults to `MYMETA.json MYMETA.yml META.json META.yml Makefile cpanfile`. +### `excludes` + +A list of regular expressions of prerequisites to exclude. One pattern per line. + ## Outputs ### `perl` diff --git a/action.yml b/action.yml index c6ff610..a37530b 100644 --- a/action.yml +++ b/action.yml @@ -21,6 +21,9 @@ inputs: description: 'Source files to check for prerequisites' required: false default: 'MYMETA.json MYMETA.yml META.json META.yml Makefile cpanfile' + exclude: + description: 'Patterns to exclude from returned prerequisites' + required: false outputs: perl: diff --git a/src/get-prereqs.mjs b/src/get-prereqs.mjs index eebcf94..4b25fad 100644 --- a/src/get-prereqs.mjs +++ b/src/get-prereqs.mjs @@ -10,12 +10,19 @@ import { } from './parser/meta.mjs'; import { mergeVersions } from './cpan-versions.mjs'; -const filterPrereqs = ({ prereqs, phases, relationships, features }) => { +const filterPrereqs = ({ + prereqs, + phases, + relationships, + features, + excludes, +}) => { return prereqs.filter( prereq => phases.has(prereq.phase) && relationships.has(prereq.relationship) - && (!prereq.feature || features.includes(prereq.feature)), + && (!prereq.feature || features.includes(prereq.feature)) + && !excludes.filter(ex => ex.exec(prereq.prereq)).length, ); }; @@ -53,6 +60,7 @@ export const getPrereqs = async ({ relationships = ['requires'], features = [], sources, + excludes = [], }) => { for (const source of sources) { const parser = parserFor(source); @@ -72,11 +80,14 @@ export const getPrereqs = async ({ const content = fh.readFile({ encoding: 'utf8' }); + const allPrereqs = await parser(content); + const filteredPrereqs = filterPrereqs({ - prereqs: await parser(content), + prereqs: allPrereqs, phases: new Set(phases), relationships: new Set(relationships), features: new Set(features), + excludes, }).toSorted(sortByPrereq); const prereqs = {}; diff --git a/src/main.mjs b/src/main.mjs index 1ef68ed..3e49da2 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -7,17 +7,20 @@ const run = async () => { const relationshipsInput = core.getInput('relationships'); const featuresInput = core.getInput('features'); const sourcesInput = core.getInput('sources'); + const excludeInput = core.getMultilineInput('exclude'); const phases = new Set(phasesInput.split(/\s+/)); const relationships = new Set(relationshipsInput.split(/\s+/)); const features = new Set(featuresInput.split(/\s+/)); const sources = sourcesInput.split(/\s+/); + const excludes = excludeInput.filter(p => p.length).map(p => new RegExp(p)); const { perl, ...prereqs } = await getPrereqs({ phases, relationships, features, sources, + excludes, }); if (perl) { diff --git a/test/action.test.mjs b/test/action.test.mjs index cfa4df0..22450b6 100644 --- a/test/action.test.mjs +++ b/test/action.test.mjs @@ -34,6 +34,7 @@ describe('GitHub action', function () { phases: 'test', relationships: 'recommends', features: '', + excludes: '', }); expect(outputs).to.be.deep.equal({ 'prereqs': 'CPAN::Meta~2.120900\n', diff --git a/test/get-prereqs.test.mjs b/test/get-prereqs.test.mjs index 414fc7c..9bf0930 100644 --- a/test/get-prereqs.test.mjs +++ b/test/get-prereqs.test.mjs @@ -71,4 +71,26 @@ describe('getPrereqs', function () { 'inc::bootstrap': '>=0', }); }); + + it('excludes applies correctly', async function () { + const filename = joinPath(__dirname, 'corpus', 'dist.ini'); + const prereqs = await getPrereqs({ + sources: [filename], + phases: ['author'], + excludes: [/^inc::/], + }); + expect(prereqs).to.be.deep.equal({ + 'Dist::Zilla': '>=5.0', + 'Dist::Zilla::Plugin::GatherFile': '>=0', + 'Dist::Zilla::Plugin::Git::GatherDir': '>=5', + 'Dist::Zilla::Plugin::PodWeaver': '>=0', + 'Dist::Zilla::PluginBundle::Basic': '>=0,>=6', + 'Dist::Zilla::PluginBundle::ConfigSlicer': '>=0', + 'Dist::Zilla::PluginBundle::Filter': '>=2', + 'Dist::Zilla::PluginBundle::Git::VersionManager': '>=0', + 'Pod::Weaver::Plugin::StopWords': '>=0', + 'Pod::Weaver::Section::Contributors': '>=0', + 'Software::License::Perl_5': '>=0', + }); + }); });