Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Test the coder CLI on Windows #241

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

Closed
kylecarbs opened this issue Feb 10, 2022 · 0 comments · Fixed by #276
Closed

Test the coder CLI on Windows #241

kylecarbs opened this issue Feb 10, 2022 · 0 comments · Fixed by #276
Labels
api Area: HTTP API site Area: frontend dashboard

Comments

@kylecarbs
Copy link
Member

The Windows ConPty API supports reading/writing through two separate file descriptors. This incompatibility with the existing Unix convention has caused pty libraries to wait for a single pipe, instead of janking a library with the two.

We can add support to https://github.com/Netflix/go-expect relatively trivially, but would have to break the exposed API (specifically the Tty() function.

I tried modifying the upstream https://github.com/creack/pty library, but it is heavily dependant on a single *os.File, so it seems unreasonable to change.

See: microsoft/terminal#262

@bryphe-coder bryphe-coder self-assigned this Feb 10, 2022
bryphe-coder added a commit that referenced this issue Feb 15, 2022
This brings together a bunch of random, partially implemented packages for support of the new(ish) Windows [`conpty`](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/) API - such that we can leverage the `expect` style of CLI tests, but in a way that works in Linux/OSX `pty`s and Windows `conpty`.

These include:
- Vendoring the `go-expect` library from Netflix w/ some tweaks to work cross-platform
- Vendoring the `pty` cross-platform implementation from [waypoint-plugin-sdk](https://github.com/hashicorp/waypoint-plugin-sdk/tree/b55c787a65ff9b7d2b32cfae80681b78f8f2275e/internal/pkg/pty)
- Vendoring the `conpty` Windows-specific implementation from [waypoint-plugin-sdk](https://github.com/hashicorp/waypoint-plugin-sdk/tree/b55c787a65ff9b7d2b32cfae80681b78f8f2275e/internal/pkg/conpty)
- Adjusting the `pty` interface to work with `go-expect` + the cross-plat version

There were several limitations with the current packages:
- `go-expect` requires the same `os.File` (TTY) for input / output, but `conhost` requires separate file handles
- `conpty` does not handle input, only output
- The cross-platform `pty` didn't expose the full set of primitives needed for `console`

Therefore, the following changes were made:
- Handling of `stdin` was added to the `conpty` interface
- We weren't using the full extent of the `go-expect` interface, so some portions were removed (ie, exec'ing a process) to simplify our implementation and make it easier to extend cross-platform
- Instead of `console` exposing just a `Tty`, it exposes an `InTty` and `OutTty`, to help encapsulate the difference on Windows (on Linux, these point to the same pipe)

Future improvements:
- The `isatty` implementation doesn't support accurate detection of `conhost` pty's without an associated process. In lieu of a more robust check, I've added a `--force-tty` flag intended for test case use - that forces the CLI to run in tty mode.
- It seems the windows implementation doesn't support setting a deadline. This is needed for the expect.Timeout API, but isn't used by us yet.

Fixes #241
@misskniss misskniss added api Area: HTTP API site Area: frontend dashboard labels Jun 14, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api Area: HTTP API site Area: frontend dashboard
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants