13
0
Fork 0
mirror of https://github.com/docker/metadata-action.git synced 2026-06-28 14:50:44 +00:00

report invalid global expressions clearly

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax 2026-05-22 14:41:37 +02:00
parent 530a407188
commit 7282ab7c69
No known key found for this signature in database
GPG key ID: ADE44D8C9D44FBE4
2 changed files with 35 additions and 2 deletions

View file

@ -76,6 +76,27 @@ describe('isRawStatement', () => {
});
});
describe('global expressions', () => {
test('throws for unknown global expression', async () => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', 'event_push_master.env')));
const toolkit = new Toolkit();
const repo = await toolkit.github.repoData();
const context = await getContext(ContextSource.workflow, toolkit);
expect(() => {
new Meta(
{
...getInputs(),
images: ['user/app'],
tags: [`type=raw,value=latest,enable={{is_prerelease}}`]
},
context,
repo
);
}).toThrow('{{is_prerelease}} is not a valid global expression');
});
});
const tagsLabelsTest = async (name: string, envFile: string, inputs: Inputs, exVersion: Version, exTags: Array<string>, exLabels: Array<string>, exAnnotations: Array<string> | undefined) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
const toolkit = new Toolkit();

View file

@ -400,7 +400,7 @@ export class Meta {
const context = this.context;
const currentDate = this.date;
const commitDate = this.context.commitDate;
return handlebars.compile(val)({
const globalExp = {
branch: function () {
if (!/^refs\/heads\//.test(context.ref)) {
return '';
@ -480,7 +480,19 @@ export class Meta {
});
return m.tz(tz).format(format);
}
});
};
const expressions = Object.keys(globalExp);
const template = handlebars.parseWithoutProcessing(val);
for (const node of template.body) {
const statement = node as {type: string; path?: {type: string; original: string}};
if (statement.type !== 'MustacheStatement' || statement.path?.type !== 'PathExpression') {
continue;
}
if (!expressions.includes(statement.path.original)) {
throw new Error(`{{${statement.path.original}}} is not a valid global expression`);
}
}
return handlebars.compile(val)(globalExp);
}
private getImageNames(): Array<string> {