Allow global prefix/suffix on latest

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2021-07-05 20:37:02 +02:00
parent aa7478bca1
commit 375e313280
7 changed files with 245 additions and 59 deletions

View File

@ -1,41 +1,71 @@
import * as core from '@actions/core';
import csvparse from 'csv-parse/lib/sync';
export interface Flavor {
latest: string;
prefix: string;
prefixLatest: boolean;
suffix: string;
suffixLatest: boolean;
}
export function Transform(inputs: string[]): Flavor {
const flavor: Flavor = {
latest: 'auto',
prefix: '',
suffix: ''
prefixLatest: false,
suffix: '',
suffixLatest: false
};
for (const input of inputs) {
const parts = input.split('=', 2);
if (parts.length == 1) {
throw new Error(`Invalid entry: ${input}`);
}
switch (parts[0]) {
case 'latest': {
flavor.latest = parts[1];
if (!['auto', 'true', 'false'].includes(flavor.latest)) {
throw new Error(`Invalid latest flavor entry: ${input}`);
const fields = csvparse(input, {
relaxColumnCount: true,
skipLinesWithEmptyValues: true
})[0];
let onlatestfor = '';
for (const field of fields) {
const parts = field.toString().split('=', 2);
if (parts.length == 1) {
throw new Error(`Invalid flavor entry: ${input}`);
}
switch (parts[0]) {
case 'latest': {
flavor.latest = parts[1];
if (!['auto', 'true', 'false'].includes(flavor.latest)) {
throw new Error(`Invalid latest flavor entry: ${input}`);
}
break;
}
case 'prefix': {
flavor.prefix = parts[1];
onlatestfor = 'prefix';
break;
}
case 'suffix': {
flavor.suffix = parts[1];
onlatestfor = 'suffix';
break;
}
case 'onlatest': {
if (!['true', 'false'].includes(parts[1])) {
throw new Error(`Invalid value for onlatest attribute: ${parts[1]}`);
}
switch (onlatestfor) {
case 'prefix': {
flavor.prefixLatest = /true/i.test(parts[1]);
break;
}
case 'suffix': {
flavor.suffixLatest = /true/i.test(parts[1]);
break;
}
}
break;
}
default: {
throw new Error(`Unknown flavor entry: ${input}`);
}
break;
}
case 'prefix': {
flavor.prefix = parts[1];
break;
}
case 'suffix': {
flavor.suffix = parts[1];
break;
}
default: {
throw new Error(`Unknown entry: ${input}`);
}
}
}
@ -43,7 +73,9 @@ export function Transform(inputs: string[]): Flavor {
core.startGroup(`Processing flavor input`);
core.info(`latest=${flavor.latest}`);
core.info(`prefix=${flavor.prefix}`);
core.info(`prefixLatest=${flavor.prefixLatest}`);
core.info(`suffix=${flavor.suffix}`);
core.info(`suffixLatest=${flavor.suffixLatest}`);
core.endGroup();
return flavor;

View File

@ -159,7 +159,6 @@ export class Meta {
vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
}
let latest: boolean = false;
let tmatch;
const isRegEx = tag.attrs['pattern'].match(/^\/(.+)\/(.*)$/);
if (isRegEx) {
@ -304,7 +303,7 @@ export class Meta {
tags.push(`${imageLc}:${partial}`);
}
if (this.version.latest) {
tags.push(`${imageLc}:latest`);
tags.push(`${imageLc}:${this.flavor.prefixLatest ? this.flavor.prefix : ''}latest${this.flavor.suffixLatest ? this.flavor.suffix : ''}`);
}
}
return tags;

View File

@ -100,7 +100,7 @@ export function Parse(s: string): Tag {
switch (key) {
case 'type': {
if (!Object.values(Type).includes(value)) {
throw new Error(`Unknown type attribute: ${value}`);
throw new Error(`Unknown tag type attribute: ${value}`);
}
tag.type = value;
break;