Merge pull request #1141 from mikepenz/feature/1135
Allow `[]` of `Transformer` to adjust tags
This commit is contained in:
@@ -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
|
||||||
})
|
})
|
||||||
|
|||||||
+49
-26
@@ -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('-');
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -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
@@ -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('-')
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user