Merge pull request #1141 from mikepenz/feature/1135

Allow `[]` of `Transformer` to adjust tags
This commit is contained in:
Mike Penz
2023-07-07 10:00:52 +02:00
committed by GitHub
6 changed files with 105 additions and 58 deletions
+4 -4
View File
@@ -1,4 +1,4 @@
import { TagInfo, filterTags, sortTags } from "github-pr-collector/lib/tags" import { TagInfo, filterTags, prepareAndSortTags } from "github-pr-collector/lib/tags"
jest.setTimeout(180000) jest.setTimeout(180000)
@@ -17,7 +17,7 @@ it('Should order tags correctly using semver', async () => {
const tagResolver = { const tagResolver = {
method: 'semver' method: 'semver'
} }
const sorted = sortTags(tags, tagResolver) const sorted = prepareAndSortTags(tags, tagResolver)
.map(function (tag) { .map(function (tag) {
return tag.name return tag.name
}) })
@@ -46,7 +46,7 @@ it('Should order tags correctly using semver', async () => {
const tagResolver = { const tagResolver = {
method: 'non-existing-method' method: 'non-existing-method'
} }
const sorted = sortTags(tags, tagResolver) const sorted = prepareAndSortTags(tags, tagResolver)
.map(function (tag) { .map(function (tag) {
return tag.name return tag.name
}) })
@@ -75,7 +75,7 @@ it('Should order tags alphabetical', async () => {
const tagResolver = { const tagResolver = {
method: 'sort' method: 'sort'
} }
const sorted = sortTags(tags, tagResolver) const sorted = prepareAndSortTags(tags, tagResolver)
.map(function (tag) { .map(function (tag) {
return tag.name return tag.name
}) })
Generated Vendored
+49 -26
View File
@@ -25745,17 +25745,17 @@ const moment_1 = __importDefault(__nccwpck_require__(9623));
const commits_1 = __nccwpck_require__(5789); const commits_1 = __nccwpck_require__(5789);
exports.EMPTY_PULL_REQUEST_INFO = { exports.EMPTY_PULL_REQUEST_INFO = {
number: 0, number: 0,
title: "", title: '',
htmlURL: "", htmlURL: '',
baseBranch: "", baseBranch: '',
mergedAt: undefined, mergedAt: undefined,
createdAt: (0, moment_1.default)(), createdAt: (0, moment_1.default)(),
mergeCommitSha: "", mergeCommitSha: '',
author: "", author: '',
repoName: "", repoName: '',
labels: [], labels: [],
milestone: "", milestone: '',
body: "", body: '',
assignees: [], assignees: [],
requestedReviewers: [], requestedReviewers: [],
approvedReviewers: [], approvedReviewers: [],
@@ -26239,7 +26239,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sortTags = exports.filterTags = exports.Tags = void 0; exports.prepareAndSortTags = exports.filterTags = exports.Tags = void 0;
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const github = __importStar(__nccwpck_require__(5438)); const github = __importStar(__nccwpck_require__(5438));
const semver = __importStar(__nccwpck_require__(1383)); const semver = __importStar(__nccwpck_require__(1383));
@@ -26330,7 +26330,7 @@ class Tags {
if (ignorePreReleases) { if (ignorePreReleases) {
core.info(`️ Enabled 'ignorePreReleases', searching for the closest release`); core.info(`️ Enabled 'ignorePreReleases', searching for the closest release`);
for (let ii = i + 1; ii < length; ii++) { for (let ii = i + 1; ii < length; ii++) {
if (!tags[ii].name.includes('-')) { if (!tags[ii].preRelease) {
return tags[ii]; return tags[ii];
} }
} }
@@ -26364,18 +26364,31 @@ class Tags {
const filteredTags = filterTags( const filteredTags = filterTags(
// retrieve the tags from the API // retrieve the tags from the API
yield this.getTags(owner, repo, maxTagsToFetch), tagResolver); yield this.getTags(owner, repo, maxTagsToFetch), tagResolver);
// check if a transformer was defined // check if a transformer, legacy handling, transform single value input to array
const tagTransformer = (0, regexUtils_1.validateTransformer)(tagResolver.transformer); let tagTransfomers = undefined;
let transformedTags; if (!Array.isArray(tagTransfomers)) {
if (tagTransformer != null) { if (tagTransfomers !== undefined) {
core.debug(`️ Using configured tagTransformer`); tagTransfomers = [tagTransfomers];
transformedTags = transformTags(filteredTags, tagTransformer); }
} }
else { else if (tagResolver.transformer !== undefined) {
transformedTags = filteredTags; tagTransfomers = tagResolver.transformer;
} }
let tags = sortTags(transformedTags, tagResolver); let transformed = false;
if (tagTransformer != null) { let transformedTags = filteredTags;
if (tagTransfomers !== undefined && tagTransfomers.length > 0) {
for (const transformer of tagTransfomers) {
const tagTransformer = (0, regexUtils_1.validateTransformer)(transformer);
if (tagTransformer != null) {
core.debug(`️ Using configured tagTransformer (${transformer.pattern})`);
transformedTags = transformTags(transformedTags, tagTransformer);
transformed = true;
}
}
}
// sort tags, apply additional information (e.g. if tag is a pre release)
let tags = prepareAndSortTags(transformedTags, tagResolver);
if (transformed) {
// restore the original name, after sorting // restore the original name, after sorting
tags = filteredTags.map(function (tag) { tags = filteredTags.map(function (tag) {
if (tag.hasOwnProperty('tmp')) { if (tag.hasOwnProperty('tmp')) {
@@ -26495,16 +26508,17 @@ function transformTags(tags, transformer) {
2020.3.1-a01 2020.3.1-a01
2020.3.0 2020.3.0
*/ */
function sortTags(tags, tagResolver) { function prepareAndSortTags(tags, tagResolver) {
if (tagResolver.method === 'sort') { if (tagResolver.method === 'sort') {
return stringSorting(tags); return stringTags(tags);
} }
else { else {
return semVerSorting(tags); // semver is default
return semVerTags(tags);
} }
} }
exports.sortTags = sortTags; exports.prepareAndSortTags = prepareAndSortTags;
function semVerSorting(tags) { function semVerTags(tags) {
// filter out tags which do not follow semver // filter out tags which do not follow semver
const validatedTags = tags.filter(tag => { const validatedTags = tags.filter(tag => {
const isValid = semver.valid(tag.name, { const isValid = semver.valid(tag.name, {
@@ -26513,6 +26527,12 @@ function semVerSorting(tags) {
if (!isValid) { if (!isValid) {
core.debug(`⚠️ dropped tag ${tag.name} because it is not a valid semver tag`); core.debug(`⚠️ dropped tag ${tag.name} because it is not a valid semver tag`);
} }
else {
tag.preRelease =
semver.prerelease(tag.name, {
loose: true
}) != null;
}
return isValid; return isValid;
}); });
// sort using semver // sort using semver
@@ -26524,7 +26544,10 @@ function semVerSorting(tags) {
}); });
return validatedTags; return validatedTags;
} }
function stringSorting(tags) { function stringTags(tags) {
for (const tag of tags) {
tag.preRelease = tag.name.includes('-');
}
return tags.sort((b, a) => { return tags.sort((b, a) => {
const partsA = a.name.replace(/^v/, '').split('-'); const partsA = a.name.replace(/^v/, '').split('-');
const partsB = b.name.replace(/^v/, '').split('-'); const partsB = b.name.replace(/^v/, '').split('-');
Generated Vendored
+1 -1
View File
File diff suppressed because one or more lines are too long
+8 -8
View File
@@ -38,17 +38,17 @@ export interface CommentInfo {
export const EMPTY_PULL_REQUEST_INFO: PullRequestInfo = { export const EMPTY_PULL_REQUEST_INFO: PullRequestInfo = {
number: 0, number: 0,
title: "", title: '',
htmlURL: "", htmlURL: '',
baseBranch: "", baseBranch: '',
mergedAt: undefined, mergedAt: undefined,
createdAt: moment(), createdAt: moment(),
mergeCommitSha: "", mergeCommitSha: '',
author: "", author: '',
repoName: "", repoName: '',
labels: [], labels: [],
milestone: "", milestone: '',
body: "", body: '',
assignees: [], assignees: [],
requestedReviewers: [], requestedReviewers: [],
approvedReviewers: [], approvedReviewers: [],
+42 -18
View File
@@ -3,7 +3,7 @@ import * as github from '@actions/github'
import * as semver from 'semver' import * as semver from 'semver'
import {Octokit, RestEndpointMethodTypes} from '@octokit/rest' import {Octokit, RestEndpointMethodTypes} from '@octokit/rest'
import {SemVer} from 'semver' import {SemVer} from 'semver'
import {RegexTransformer, TagResolver} from './types' import {RegexTransformer, TagResolver, Transformer} from './types'
import {createCommandManager} from './gitHelper' import {createCommandManager} from './gitHelper'
import moment from 'moment' import moment from 'moment'
import {validateTransformer} from './regexUtils' import {validateTransformer} from './regexUtils'
@@ -16,6 +16,7 @@ export interface TagResult {
export interface TagInfo { export interface TagInfo {
name: string name: string
commit?: string commit?: string
preRelease?: boolean
date?: moment.Moment date?: moment.Moment
} }
@@ -104,7 +105,7 @@ export class Tags {
if (ignorePreReleases) { if (ignorePreReleases) {
core.info(`️ Enabled 'ignorePreReleases', searching for the closest release`) core.info(`️ Enabled 'ignorePreReleases', searching for the closest release`)
for (let ii = i + 1; ii < length; ii++) { for (let ii = i + 1; ii < length; ii++) {
if (!tags[ii].name.includes('-')) { if (!tags[ii].preRelease) {
return tags[ii] return tags[ii]
} }
} }
@@ -146,20 +147,33 @@ export class Tags {
tagResolver tagResolver
) )
// check if a transformer was defined // check if a transformer, legacy handling, transform single value input to array
const tagTransformer = validateTransformer(tagResolver.transformer) let tagTransfomers: Transformer[] | undefined = undefined
if (!Array.isArray(tagTransfomers)) {
let transformedTags: TagInfo[] if (tagTransfomers !== undefined) {
if (tagTransformer != null) { tagTransfomers = [tagTransfomers]
core.debug(`️ Using configured tagTransformer`) }
transformedTags = transformTags(filteredTags, tagTransformer) } else if (tagResolver.transformer !== undefined) {
} else { tagTransfomers = tagResolver.transformer as Transformer[]
transformedTags = filteredTags
} }
let tags = sortTags(transformedTags, tagResolver) let transformed = false
let transformedTags: TagInfo[] = filteredTags
if (tagTransfomers !== undefined && tagTransfomers.length > 0) {
for (const transformer of tagTransfomers) {
const tagTransformer = validateTransformer(transformer)
if (tagTransformer != null) {
core.debug(`️ Using configured tagTransformer (${transformer.pattern})`)
transformedTags = transformTags(transformedTags, tagTransformer)
transformed = true
}
}
}
if (tagTransformer != null) { // sort tags, apply additional information (e.g. if tag is a pre release)
let tags = prepareAndSortTags(transformedTags, tagResolver)
if (transformed) {
// restore the original name, after sorting // restore the original name, after sorting
tags = filteredTags.map(function (tag) { tags = filteredTags.map(function (tag) {
if (tag.hasOwnProperty('tmp')) { if (tag.hasOwnProperty('tmp')) {
@@ -278,15 +292,16 @@ function transformTags(tags: TagInfo[], transformer: RegexTransformer): TagInfo[
2020.3.1-a01 2020.3.1-a01
2020.3.0 2020.3.0
*/ */
export function sortTags(tags: TagInfo[], tagResolver: TagResolver): TagInfo[] { export function prepareAndSortTags(tags: TagInfo[], tagResolver: TagResolver): TagInfo[] {
if (tagResolver.method === 'sort') { if (tagResolver.method === 'sort') {
return stringSorting(tags) return stringTags(tags)
} else { } else {
return semVerSorting(tags) // semver is default
return semVerTags(tags)
} }
} }
function semVerSorting(tags: TagInfo[]): TagInfo[] { function semVerTags(tags: TagInfo[]): TagInfo[] {
// filter out tags which do not follow semver // filter out tags which do not follow semver
const validatedTags = tags.filter(tag => { const validatedTags = tags.filter(tag => {
const isValid = const isValid =
@@ -295,6 +310,11 @@ function semVerSorting(tags: TagInfo[]): TagInfo[] {
}) !== null }) !== null
if (!isValid) { if (!isValid) {
core.debug(`⚠️ dropped tag ${tag.name} because it is not a valid semver tag`) core.debug(`⚠️ dropped tag ${tag.name} because it is not a valid semver tag`)
} else {
tag.preRelease =
semver.prerelease(tag.name, {
loose: true
}) != null
} }
return isValid return isValid
}) })
@@ -309,7 +329,11 @@ function semVerSorting(tags: TagInfo[]): TagInfo[] {
return validatedTags return validatedTags
} }
function stringSorting(tags: TagInfo[]): TagInfo[] { function stringTags(tags: TagInfo[]): TagInfo[] {
for (const tag of tags) {
tag.preRelease = tag.name.includes('-')
}
return tags.sort((b, a) => { return tags.sort((b, a) => {
const partsA = a.name.replace(/^v/, '').split('-') const partsA = a.name.replace(/^v/, '').split('-')
const partsB = b.name.replace(/^v/, '').split('-') const partsB = b.name.replace(/^v/, '').split('-')
+1 -1
View File
@@ -36,7 +36,7 @@ export interface Sort {
export interface TagResolver { export interface TagResolver {
method: string // semver, sort method: string // semver, sort
filter?: Regex // the regex to filter the tags, prior to sorting filter?: Regex // the regex to filter the tags, prior to sorting
transformer?: Transformer // transforms the tag name using the regex, run after the filter transformer?: Transformer | Transformer[] // transforms the tag name using the regex, run after the filter
} }
export interface Regex { export interface Regex {