mirror of
https://github.com/goreleaser/goreleaser-action.git
synced 2026-05-14 14:50:32 +00:00
Resolves the GoReleaser version from a file. Currently supports the
asdf/mise `.tool-versions` format; resolved value takes precedence
over the `version` input.
# .tool-versions
goreleaser 2.13.0
- uses: goreleaser/goreleaser-action@v7
with:
version-file: .tool-versions
args: release --clean
Path is resolved relative to `workdir` unless absolute. Bare semvers
are auto-prefixed with `v`; constraint expressions and `latest` are
returned as-is. Multiple fallback versions per asdf convention are
accepted but only the first is used.
Refs #541
Closes #542
Co-authored-by: Anthony Couvreur <22034450+acouvreur@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import {Inputs} from './context';
|
|
|
|
// Resolves the GoReleaser version to install.
|
|
//
|
|
// When `version-file` is set, it is read from disk and parsed; the resolved
|
|
// value takes precedence over the `version` input. Otherwise, `version` is
|
|
// returned as-is (it always has a default — see context.getInputs).
|
|
export function getRequestedVersion(inputs: Inputs): string {
|
|
if (!inputs.versionFile) {
|
|
return inputs.version;
|
|
}
|
|
|
|
const filePath = path.isAbsolute(inputs.versionFile)
|
|
? inputs.versionFile
|
|
: path.join(inputs.workdir || '.', inputs.versionFile);
|
|
|
|
if (!fs.existsSync(filePath)) {
|
|
throw new Error(`version-file not found: ${filePath}`);
|
|
}
|
|
|
|
const basename = path.basename(filePath);
|
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
|
|
switch (basename) {
|
|
case '.tool-versions':
|
|
return parseToolVersions(content, filePath);
|
|
default:
|
|
throw new Error(`Unsupported version-file: ${filePath} (only .tool-versions is supported)`);
|
|
}
|
|
}
|
|
|
|
// Parses a single `goreleaser <version>` entry out of a `.tool-versions` file
|
|
// (asdf/mise format). Full-line `#` comments and inline `# ...` suffixes are
|
|
// stripped. When a tool lists multiple fallback versions only the first is
|
|
// used. Bare semvers are returned with a leading `v`; constraint expressions
|
|
// (`~> v2`, `latest`, ...) are returned as-is.
|
|
function parseToolVersions(content: string, filePath: string): string {
|
|
for (const rawLine of content.split('\n')) {
|
|
const line = rawLine.replace(/#.*$/, '').trim();
|
|
if (!line) {
|
|
continue;
|
|
}
|
|
const tokens = line.split(/\s+/);
|
|
if (tokens[0] !== 'goreleaser') {
|
|
continue;
|
|
}
|
|
const version = tokens[1];
|
|
if (!version) {
|
|
throw new Error(`No version specified for goreleaser in ${filePath}`);
|
|
}
|
|
return /^\d/.test(version) ? `v${version}` : version;
|
|
}
|
|
throw new Error(`No goreleaser entry found in ${filePath}`);
|
|
}
|