From 22918e21938990ae8d692b9b59cccb9846aed673 Mon Sep 17 00:00:00 2001 From: Dan Allen Date: Sat, 29 Feb 2020 02:33:42 -0700 Subject: [PATCH] brace pattern in start paths value should match explicit entries if wildcard entry is also present --- CHANGELOG.adoc | 1 + .../content-aggregator/lib/resolve-path-globs.js | 14 +++++++------- .../test/aggregate-content-test.js | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index bb3620cca..ae6641051 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -10,6 +10,7 @@ This project utilizes semantic versioning. === Fixed * *content-aggregator*: Brace pattern in start paths value should match whole filename segment, even if pattern contains a wildcard (#583) +* *content-aggregator*: Brace pattern in start paths value should match explicit entries if wildcard entry is also present (#584) === Changed diff --git a/packages/content-aggregator/lib/resolve-path-globs.js b/packages/content-aggregator/lib/resolve-path-globs.js index 3119d6b66..2f6f3f4e6 100644 --- a/packages/content-aggregator/lib/resolve-path-globs.js +++ b/packages/content-aggregator/lib/resolve-path-globs.js @@ -40,7 +40,7 @@ async function glob (base, patternSegments, listDirents, retrievePath, { oid, pa patternSegments = patternSegments.slice(1) if (RX_MAGIC_DETECTOR.test(patternSegment)) { let isMatch - let expressed + let explicit if (patternSegment === '*') { isMatch = invariably.true } else if (~patternSegment.indexOf('{')) { @@ -49,20 +49,20 @@ async function glob (base, patternSegments, listDirents, retrievePath, { oid, pa if (~patternSegment.indexOf('?')) patternSegment = patternSegment.replace(RX_QUESTION_MARK, '\\?') isMatch = (isMatch = makePicomatchRx(patternSegment, PICO_OPTS)).test.bind(isMatch) } else if (~patternSegment.indexOf('*')) { - const [wildPatterns, fixedSegments] = expandBraces(patternSegment).reduce( - ([wild, fixed], item) => (~item.indexOf('*') ? [wild.concat(item), fixed] : [wild, fixed.concat(item)]), + const [wildPatterns, literals] = expandBraces(patternSegment).reduce( + ([wild, literal], it) => (~it.indexOf('*') ? [wild.concat(it), literal] : [wild, literal.concat(it)]), [[], []] ) isMatch = (isMatch = makeAlternationMatcherRx(wildPatterns)).test.bind(isMatch) - expressed = new Set(fixedSegments) + explicit = new Set(literals) } else { return expandBraces(patternSegment).map((it) => joinPath(path, it)) } } else { isMatch = (isMatch = makeMatcherRx(patternSegment)).test.bind(isMatch) } - const dirents = await listDirents(base, oid || path) - if (expressed) dirents.forEach((dirent) => expressed.delete(dirent.name)) + let dirents = await listDirents(base, oid || path) + if (explicit) dirents = dirents.filter((dirent) => !explicit.has(dirent.name)) const discovered = flattenDeep( await Promise.all( dirents.map((dirent) => @@ -78,7 +78,7 @@ async function glob (base, patternSegments, listDirents, retrievePath, { oid, pa ) ) ) - return expressed ? discovered.concat([...expressed].map((it) => joinPath(path, it))) : discovered + return explicit ? [...explicit].map((it) => joinPath(path, it)).concat(discovered) : discovered } else { const [magicBase, nextSegment] = extractMagicBase(patternSegments, patternSegment) patternSegment = magicBase diff --git a/packages/content-aggregator/test/aggregate-content-test.js b/packages/content-aggregator/test/aggregate-content-test.js index 03f90741f..2e4ca2139 100644 --- a/packages/content-aggregator/test/aggregate-content-test.js +++ b/packages/content-aggregator/test/aggregate-content-test.js @@ -548,7 +548,7 @@ describe('aggregateContent()', function () { expect(componentDescEntry1).to.exist() expect(componentDescEntry2).to.exist() expect(componentDescEntry3).to.exist() - playbookSpec.content.sources.push({ url: repoBuilder.url, startPaths: '{doc{s,x},moredocs}' }) + playbookSpec.content.sources.push({ url: repoBuilder.url, startPaths: '{doc{s,x},more*}' }) const aggregate = await aggregateContent(playbookSpec) expect(aggregate).to.have.lengthOf(3) expect(aggregate[0]).to.deep.include(componentDesc1) -- GitLab