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

net: powershell invocation in tests broken in sysarm32 mode #42858

Open
zx2c4 opened this issue Nov 27, 2020 · 6 comments
Open

net: powershell invocation in tests broken in sysarm32 mode #42858

zx2c4 opened this issue Nov 27, 2020 · 6 comments

Comments

@zx2c4
Copy link
Contributor

@zx2c4 zx2c4 commented Nov 27, 2020

Windows 10 for ARM64 will run ARM32 executables just fine, which is why we're using it for Go builders.

There's currently a bug in which invoking powershell from an arm32 process will fail:
image

I've worked around that by grabbing a zip of powershell 7.1, adding the unzipped directory to the builder's PATH, and then copying pwsh.exe to powershell.exe. I'm waiting for some builds to finish, but I think that should work alright.

The reason this matters for Go is that some of the tests use powershell just to invoke a simple command:

func runCmd(args ...string) ([]byte, error) {
        removeUTF8BOM := func(b []byte) []byte {
                if len(b) >= 3 && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF {
                        return b[3:]
                }
                return b
        }
        f, err := ioutil.TempFile("", "netcmd")
        if err != nil {
                return nil, err
        }
        f.Close()
        defer os.Remove(f.Name())
        cmd := fmt.Sprintf(`%s | Out-File "%s" -encoding UTF8`, strings.Join(args, " "), f.Name())
        out, err := exec.Command("powershell", "-Command", cmd).CombinedOutput()

I'm pretty sure we can come up with something better than powershell -Command for the tests, which would make this problem go away. Or sooner or later Microsoft will probably fix it. Or my workaround will suffice.

Either way, I thought I should at least document this.

CC @alexbrainman @jstarks @cagedmantis

@alexbrainman
Copy link
Member

@alexbrainman alexbrainman commented Nov 27, 2020

I am happy to get rid of powershell dependency, if possible.

From what I remember we mainly use powershell to be able to read non-ASCII output of Windows commands on non-English versions of Windows.

Including @mattn because he uses non-English Windows.

Alex

@mattn
Copy link
Member

@mattn mattn commented Nov 28, 2020

One another way to avoid the issue is call chcp 65001 before any commands. it output english. Or call API GetConsoleCP and SetConsoleOutputCP.

cp := windows.GetConsoleCP()
defer windows.SetConsoleOutputCP(cp)
windows.SetConsoleOutputCP(windows.CP_UTF8)

// do something

(But currently internal/syscall/windows does not have the APIs)

@gopherbot
Copy link

@gopherbot gopherbot commented Nov 28, 2020

Change https://golang.org/cl/273673 mentions this issue: net: set and restore console codepage in runCmd

@zx2c4
Copy link
Contributor Author

@zx2c4 zx2c4 commented Nov 28, 2020

windows.SetConsoleOutputCP(windows.CP_UTF8)

I wonder if Go should call that in the runtime init anyway...

@zx2c4
Copy link
Contributor Author

@zx2c4 zx2c4 commented Nov 28, 2020

No.

https://dev.to/mattn/please-stop-hack-chcp-65001-27db

Good to know. Thanks for the info.

@FiloSottile FiloSottile changed the title windows/arm: powershell broken in sysarm32 mode net: powershell invocation in tests broken in sysarm32 mode Nov 29, 2020
@FiloSottile FiloSottile added the Testing label Nov 29, 2020
@cagedmantis cagedmantis added this to the Backlog milestone Dec 7, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
7 participants
You can’t perform that action at this time.