Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go_download_sdk: apply extraction workaround to zips on non-windows OSs #3563

Merged
merged 5 commits into from
Jun 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 35 additions & 6 deletions go/private/sdk.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ load(
"//go/private:nogo.bzl",
"go_register_nogo",
)
load(
"//go/private/skylib/lib:versions.bzl",
"versions",
)

MIN_SUPPORTED_VERSION = (1, 14, 0)

Expand Down Expand Up @@ -405,14 +409,27 @@ def _register_toolchains(repo):
def _remote_sdk(ctx, urls, strip_prefix, sha256):
if len(urls) == 0:
fail("no urls specified")
host_goos, _ = detect_host_platform(ctx)

ctx.report_progress("Downloading and extracting Go toolchain")

# TODO(#2771): After bazelbuild/bazel#18448 is merged and available in
# the minimum supported version of Bazel, remove the workarounds below.
#
# Go ships archives containing some non-ASCII file names, used in
# test cases for Go's build system. Bazel has a bug extracting these
# archives on certain file systems (macOS AFS at least, possibly also
# Docker on macOS with a bind mount).
#
# For .tar.gz files (available for most platforms), we work around this bug
# by using the system tar instead of ctx.download_and_extract.
#
# For .zip files, we use ctx.download_and_extract but with rename_files,
# changing certain paths that trigger the bug. This is only available
# in Bazel 6.0.0+ (bazelbuild/bazel#16052). The only situation where
# .zip files are needed seems to be a macOS host using a Windows toolchain
# for remote execution.
if urls[0].endswith(".tar.gz"):
# BUG(#2771): Use a system tool to extract the archive instead of
# Bazel's implementation. With some configurations (macOS + Docker +
# some particular file system binding), Bazel's implementation rejects
# files with invalid unicode names. Go has at least one test case with a
# file like this, but we haven't been able to reproduce the failure, so
# instead, we use this workaround.
if strip_prefix != "go":
fail("strip_prefix not supported")
ctx.download(
Expand All @@ -424,6 +441,18 @@ def _remote_sdk(ctx, urls, strip_prefix, sha256):
if res.return_code:
fail("error extracting Go SDK:\n" + res.stdout + res.stderr)
ctx.delete("go_sdk.tar.gz")
elif (urls[0].endswith(".zip") and
host_goos != "windows" and
versions.is_at_least("6.0.0", versions.get())):
ctx.download_and_extract(
url = urls,
stripPrefix = strip_prefix,
sha256 = sha256,
rename_files = {
"go/test/fixedbugs/issue27836.dir/\336foo.go": "go/test/fixedbugs/issue27836.dir/thfoo.go",
"go/test/fixedbugs/issue27836.dir/\336main.go": "go/test/fixedbugs/issue27836.dir/thmain.go",
},
)
else:
ctx.download_and_extract(
url = urls,
Expand Down
26 changes: 25 additions & 1 deletion tests/core/go_download_sdk/go_download_sdk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ func Test(t *testing.T) {
for _, test := range []struct {
desc, rule string
optToWantVersion map[string]string
fetchOnly string
}{
{
desc: "version",
Expand All @@ -70,7 +71,8 @@ go_download_sdk(

`,
optToWantVersion: map[string]string{"": "go1.16"},
}, {
},
{
desc: "custom_archives",
rule: `
load("@io_bazel_rules_go//go:deps.bzl", "go_download_sdk")
Expand Down Expand Up @@ -114,6 +116,21 @@ go_download_sdk(
"--@io_bazel_rules_go//go/toolchain:sdk_version=1.17.1": "go1.17.1",
},
},
{
// Cover workaround for #2771.
desc: "windows_zip",
rule: `
load("@io_bazel_rules_go//go:deps.bzl", "go_download_sdk")

go_download_sdk(
name = "go_sdk",
goarch = "amd64",
goos = "windows",
version = "1.20.4",
)
`,
fetchOnly: "@go_sdk//:BUILD.bazel",
},
} {
t.Run(test.desc, func(t *testing.T) {
origWorkspaceData, err := ioutil.ReadFile("WORKSPACE")
Expand Down Expand Up @@ -143,6 +160,13 @@ go_register_toolchains()
}
}()

if test.fetchOnly != "" {
if err := bazel_testing.RunBazel("fetch", test.fetchOnly); err != nil {
t.Fatal(err)
}
return
}

for opt, wantVersion := range test.optToWantVersion {
t.Run(wantVersion, func(t *testing.T) {
args := []string{
Expand Down