mirror of
https://github.com/actions/setup-go.git
synced 2026-04-11 07:00:04 +00:00
fix: parse go-version-file by content
The `parseGoVersionFile` function used to only
check for exact filenames like "go.{mod,work}".
When `go-version-file` pointed to something like a
tools modfile ("go.tool.mod"), it would just dump
the whole file contents back, which then got
mistaken for a version spec and broke the
manifest/dist resolution.
Now it looks at the file content to spot Go module
or workspace files and pulls out the `toolchain`
or `go` directives. Left ".tool-versions" handling
alone.
Fixes #746
Signed-off-by: Dwi Siswanto <git@dw1.io>
This commit is contained in:
parent
4a3601121d
commit
493769a1ce
4 changed files with 61 additions and 21 deletions
23
dist/setup/index.js
vendored
23
dist/setup/index.js
vendored
|
|
@ -77493,26 +77493,33 @@ function makeSemver(version) {
|
|||
return fullVersion;
|
||||
}
|
||||
function parseGoVersionFile(versionFilePath) {
|
||||
const moduleOrWorkspaceDirective = /^\s*go\s+(\d+(?:\.\d+)*)/m;
|
||||
const toolchainDirective = /^\s*toolchain\s+go(1\.\d+(?:\.\d+|rc\d+)?)/m;
|
||||
const moduleDeclaration = /^\s*module\s+\S+/m;
|
||||
const workspaceUseDirective = /^\s*use(?:\s+\S+|\s*\()/m;
|
||||
const contents = fs_1.default.readFileSync(versionFilePath).toString();
|
||||
if (path.basename(versionFilePath) === 'go.mod' ||
|
||||
path.basename(versionFilePath) === 'go.work') {
|
||||
const fileName = path.basename(versionFilePath);
|
||||
const isGoModOrWorkFileName = fileName === 'go.mod' || fileName === 'go.work';
|
||||
const isGoModuleOrWorkspaceLike = moduleOrWorkspaceDirective.test(contents) &&
|
||||
(moduleDeclaration.test(contents) || workspaceUseDirective.test(contents));
|
||||
if (fileName === '.tool-versions') {
|
||||
const match = contents.match(/^golang\s+([^\n#]+)/m);
|
||||
return match ? match[1].trim() : '';
|
||||
}
|
||||
if (isGoModOrWorkFileName || isGoModuleOrWorkspaceLike) {
|
||||
// for backwards compatibility: use version from go directive if
|
||||
// 'GOTOOLCHAIN' has been explicitly set
|
||||
if (process.env[exports.GOTOOLCHAIN_ENV_VAR] !== exports.GOTOOLCHAIN_LOCAL_VAL) {
|
||||
// toolchain directive: https://go.dev/ref/mod#go-mod-file-toolchain
|
||||
const matchToolchain = contents.match(/^toolchain go(1\.\d+(?:\.\d+|rc\d+)?)/m);
|
||||
const matchToolchain = contents.match(toolchainDirective);
|
||||
if (matchToolchain) {
|
||||
return matchToolchain[1];
|
||||
}
|
||||
}
|
||||
// go directive: https://go.dev/ref/mod#go-mod-file-go
|
||||
const matchGo = contents.match(/^go (\d+(\.\d+)*)/m);
|
||||
const matchGo = contents.match(moduleOrWorkspaceDirective);
|
||||
return matchGo ? matchGo[1] : '';
|
||||
}
|
||||
else if (path.basename(versionFilePath) === '.tool-versions') {
|
||||
const match = contents.match(/^golang\s+([^\n#]+)/m);
|
||||
return match ? match[1].trim() : '';
|
||||
}
|
||||
return contents.trim();
|
||||
}
|
||||
function resolveStableVersionDist(versionSpec, arch) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue