From 1fa3f709a957b00f957c680a88d0edfbacc3022a Mon Sep 17 00:00:00 2001 From: Mike Penz Date: Fri, 12 Nov 2021 11:36:29 +0100 Subject: [PATCH 1/3] - add ability to provide an `empty` string in case the regex does not match - FIX https://github.com/mikepenz/release-changelog-builder-action/issues/576 --- __tests__/transform.test.ts | 29 +++++++++++++++++++++++++++++ src/configuration.ts | 1 + src/transform.ts | 11 +++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/__tests__/transform.test.ts b/__tests__/transform.test.ts index 5dbb2548..c3c977d6 100644 --- a/__tests__/transform.test.ts +++ b/__tests__/transform.test.ts @@ -18,6 +18,10 @@ configuration.categories = [ { title: '## ๐Ÿงช Tests', labels: ['[Test]'] + }, + { + title: '## ๐Ÿงช Others', + labels: ['[Other]'] } ] @@ -192,6 +196,31 @@ it('Extract label from title, match multiple', async () => { ) }) +it('Extract label from title, match multiple, custon non matching label', async () => { + configuration.label_extractor = [ + { + pattern: '\\[Feature\\]|\\[Issue\\]', + on_property: 'title', + method: 'match', + on_empty: '[Other]' + } + ] + + const resultChangelog = buildChangelog(mergedPullRequests, { + owner: 'mikepenz', + repo: 'test-repo', + fromTag: '1.0.0', + toTag: '2.0.0', + failOnError: false, + commitMode: false, + configuration + }) + + expect(resultChangelog).toStrictEqual( + `## ๐Ÿš€ Features\n\n- [Feature][AB-1234] - this is a PR 1 title message\n - PR: #1\n- [Issue][Feature][AB-1234321] - this is a PR 3 title message\n - PR: #3\n\n## ๐Ÿ› Fixes\n\n- [Issue][AB-4321] - this is a PR 2 title message\n - PR: #2\n- [Issue][Feature][AB-1234321] - this is a PR 3 title message\n - PR: #3\n\n## ๐Ÿงช Others\n\n- [AB-404] - not found label\n - PR: #4\n\n` + ) +}) + // test set of PRs with lables predefined const pullRequestsWithLabels: PullRequestInfo[] = [] pullRequestsWithLabels.push( diff --git a/src/configuration.ts b/src/configuration.ts index dbe653f9..7341b98f 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -34,6 +34,7 @@ export interface Transformer extends Regex { export interface Extractor extends Transformer { on_property?: 'title' | 'author' | 'milestone' | 'body' | undefined // retrieve the property to extract the value from method?: 'replace' | 'match' | undefined // the method to use to extract the value, `match` will not use the `target` property + on_empty?: string | undefined // in case the regex results in an empty string, this value is gonna be used instead (only for label_extractor currently) } export interface TagResolver { diff --git a/src/transform.ts b/src/transform.ts index b0408dbf..15b42756 100644 --- a/src/transform.ts +++ b/src/transform.ts @@ -302,9 +302,11 @@ export function validateTransformer( try { let onProperty = undefined let method = undefined + let onEmpty = undefined if (transformer.hasOwnProperty('on_property')) { onProperty = (transformer as Extractor).on_property method = (transformer as Extractor).method + onEmpty = (transformer as Extractor).on_empty } return { @@ -314,7 +316,8 @@ export function validateTransformer( ), target: transformer.target || '', onProperty, - method + method, + onEmpty } } catch (e) { core.warning(`โš ๏ธ Bad replacer regex: ${transformer.pattern}`) @@ -347,7 +350,7 @@ function extractValues( if (extractor.method === 'match') { const lables = onValue.match(extractor.pattern) - if (lables !== null) { + if (lables !== null && lables.length > 0) { return lables.map(label => label.toLocaleLowerCase('en')) } } else { @@ -356,6 +359,9 @@ function extractValues( return [label.toLocaleLowerCase('en')] } } + if (extractor.onEmpty !== undefined) { + return [extractor.onEmpty.toLocaleLowerCase('en')] + } return null } @@ -364,4 +370,5 @@ export interface RegexTransformer { target: string onProperty?: 'title' | 'author' | 'milestone' | 'body' | undefined method?: 'replace' | 'match' | undefined + onEmpty?: string | undefined } From 679f723540af3e83fec7e3472ca2b2a3a1a8891b Mon Sep 17 00:00:00 2001 From: Mike Penz Date: Fri, 12 Nov 2021 11:40:13 +0100 Subject: [PATCH 2/3] - add README note for possible transformer in tag_resolver --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 03bdf929..f25794b5 100644 --- a/README.md +++ b/README.md @@ -329,6 +329,7 @@ Table of descriptions for the `configuration.json` options to configure the resu | tag_resolver | Section to provide configuration for the tag resolving logic. Used if no `fromTag` is provided | | tag_resolver.method | Defines the method to use. Current options are: `semver`, `sort`. Default: `semver` | | tag_resolver.filter | Defines a regex which is used to filter out tags not matching. | +| tag_resolver.transformer | Defines a regex transformer used to optionally transform the tag after the filter was applied. Allows to adjust the format to e.g. semver. | | base_branches | The target branches for the merged PR, ingnores PRs with different target branch. Values can be a `regex`. Default: allow all base branches | ## Contribute ๐Ÿงฌ From a9444bde1331699c36d07f486558fe1b4faf0c32 Mon Sep 17 00:00:00 2001 From: Mike Penz Date: Fri, 12 Nov 2021 11:41:57 +0100 Subject: [PATCH 3/3] - add readme for `on_empty` property --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f25794b5..9407ea54 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,7 @@ Table of descriptions for the `configuration.json` options to configure the resu | label_extractor.on_property | The property to retrieve the text from. This is optional. Defaults to: `body`. Alternative values: `title`, `author`, `milestone`. | | label_extractor.method | The extraction method used. Defaults to: `replace`. Alternative value: `match`. The method specified references the JavaScript String method. | | label_extractor.flags | Defines the regex flags specified for the pattern. Default: `gu` | +| label_extractor.on_empty | Defines the placeholder to be filled in, if the regex does not lead to a result. | | duplicate_filter | Defines the `Extractor` to use for retrieving the identifier for a PR. In case of duplicates will keep the last matching pull request (depends on `sort`). See `label_extractor` for details on `Extractor` properties. | | transformers | An array of `transform` specifications, offering a flexible API to modify the text per pull request. This is applied on the change text created with `pr_template`. `transformers` are executed per change, in the order specified | | transformer.pattern | A `regex` pattern, extracting values of the change message. |