|
@@ -31,27 +31,24 @@ type DockerCli struct {
|
|
|
// configFile has the client configuration file
|
|
|
configFile *configfile.ConfigFile
|
|
|
// in holds the input stream and closer (io.ReadCloser) for the client.
|
|
|
+ // TODO: remove
|
|
|
in io.ReadCloser
|
|
|
- // out holds the output stream (io.Writer) for the client.
|
|
|
- out io.Writer
|
|
|
// err holds the error stream (io.Writer) for the client.
|
|
|
err io.Writer
|
|
|
// keyFile holds the key file as a string.
|
|
|
keyFile string
|
|
|
// inFd holds the file descriptor of the client's STDIN (if valid).
|
|
|
+ // TODO: remove
|
|
|
inFd uintptr
|
|
|
- // outFd holds file descriptor of the client's STDOUT (if valid).
|
|
|
- outFd uintptr
|
|
|
// isTerminalIn indicates whether the client's STDIN is a TTY
|
|
|
+ // TODO: remove
|
|
|
isTerminalIn bool
|
|
|
- // isTerminalOut indicates whether the client's STDOUT is a TTY
|
|
|
- isTerminalOut bool
|
|
|
// client is the http client that performs all API operations
|
|
|
client client.APIClient
|
|
|
// inState holds the terminal input state
|
|
|
+ // TODO: remove
|
|
|
inState *term.State
|
|
|
- // outState holds the terminal output state
|
|
|
- outState *term.State
|
|
|
+ out *OutStream
|
|
|
}
|
|
|
|
|
|
// Client returns the APIClient
|
|
@@ -60,7 +57,7 @@ func (cli *DockerCli) Client() client.APIClient {
|
|
|
}
|
|
|
|
|
|
// Out returns the writer used for stdout
|
|
|
-func (cli *DockerCli) Out() io.Writer {
|
|
|
+func (cli *DockerCli) Out() *OutStream {
|
|
|
return cli.out
|
|
|
}
|
|
|
|
|
@@ -80,20 +77,11 @@ func (cli *DockerCli) ConfigFile() *configfile.ConfigFile {
|
|
|
}
|
|
|
|
|
|
// IsTerminalIn returns true if the clients stdin is a TTY
|
|
|
+// TODO: remove
|
|
|
func (cli *DockerCli) IsTerminalIn() bool {
|
|
|
return cli.isTerminalIn
|
|
|
}
|
|
|
|
|
|
-// IsTerminalOut returns true if the clients stdout is a TTY
|
|
|
-func (cli *DockerCli) IsTerminalOut() bool {
|
|
|
- return cli.isTerminalOut
|
|
|
-}
|
|
|
-
|
|
|
-// OutFd returns the fd for the stdout stream
|
|
|
-func (cli *DockerCli) OutFd() uintptr {
|
|
|
- return cli.outFd
|
|
|
-}
|
|
|
-
|
|
|
// CheckTtyInput checks if we are trying to attach to a container tty
|
|
|
// from a non-tty client input stream, and if so, returns an error.
|
|
|
func (cli *DockerCli) CheckTtyInput(attachStdin, ttyMode bool) error {
|
|
@@ -119,12 +107,8 @@ func (cli *DockerCli) setRawTerminal() error {
|
|
|
}
|
|
|
cli.inState = state
|
|
|
}
|
|
|
- if cli.isTerminalOut {
|
|
|
- state, err := term.SetRawTerminalOutput(cli.outFd)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- cli.outState = state
|
|
|
+ if err := cli.out.setRawTerminal(); err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
return nil
|
|
@@ -134,9 +118,7 @@ func (cli *DockerCli) restoreTerminal(in io.Closer) error {
|
|
|
if cli.inState != nil {
|
|
|
term.RestoreTerminal(cli.inFd, cli.inState)
|
|
|
}
|
|
|
- if cli.outState != nil {
|
|
|
- term.RestoreTerminal(cli.outFd, cli.outState)
|
|
|
- }
|
|
|
+ cli.out.restoreTerminal()
|
|
|
// WARNING: DO NOT REMOVE THE OS CHECK !!!
|
|
|
// For some reason this Close call blocks on darwin..
|
|
|
// As the client exists right after, simply discard the close
|
|
@@ -149,22 +131,17 @@ func (cli *DockerCli) restoreTerminal(in io.Closer) error {
|
|
|
|
|
|
// Initialize the dockerCli runs initialization that must happen after command
|
|
|
// line flags are parsed.
|
|
|
-func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions) error {
|
|
|
+func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions) (err error) {
|
|
|
cli.configFile = LoadDefaultConfigFile(cli.err)
|
|
|
|
|
|
- client, err := NewAPIClientFromFlags(opts.Common, cli.configFile)
|
|
|
+ cli.client, err = NewAPIClientFromFlags(opts.Common, cli.configFile)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- cli.client = client
|
|
|
-
|
|
|
if cli.in != nil {
|
|
|
cli.inFd, cli.isTerminalIn = term.GetFdInfo(cli.in)
|
|
|
}
|
|
|
- if cli.out != nil {
|
|
|
- cli.outFd, cli.isTerminalOut = term.GetFdInfo(cli.out)
|
|
|
- }
|
|
|
|
|
|
if opts.Common.TrustKey == "" {
|
|
|
cli.keyFile = filepath.Join(cliconfig.ConfigDir(), cliflags.DefaultTrustKeyFile)
|
|
@@ -177,11 +154,7 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions) error {
|
|
|
|
|
|
// NewDockerCli returns a DockerCli instance with IO output and error streams set by in, out and err.
|
|
|
func NewDockerCli(in io.ReadCloser, out, err io.Writer) *DockerCli {
|
|
|
- return &DockerCli{
|
|
|
- in: in,
|
|
|
- out: out,
|
|
|
- err: err,
|
|
|
- }
|
|
|
+ return &DockerCli{in: in, out: NewOutStream(out), err: err}
|
|
|
}
|
|
|
|
|
|
// LoadDefaultConfigFile attempts to load the default config file and returns
|