diff --git a/go.mod b/go.mod index 96db292b5..630e77a47 100644 --- a/go.mod +++ b/go.mod @@ -84,7 +84,7 @@ require ( github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82 github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786 // indirect github.com/masterzen/winrm v0.0.0-20200615185753-c42b5136ff88 - github.com/mattn/go-colorable v0.1.8 + github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-shellwords v1.0.4 github.com/miekg/dns v1.0.8 // indirect @@ -97,7 +97,6 @@ require ( github.com/mitchellh/gox v1.0.1 github.com/mitchellh/mapstructure v1.1.2 github.com/mitchellh/panicwrap v1.0.0 - github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51 github.com/mitchellh/reflectwalk v1.0.1 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/packer-community/winrmcp v0.0.0-20180921211025-c76d91c1e7db diff --git a/go.sum b/go.sum index 4866cfeb7..7eb70d228 100644 --- a/go.sum +++ b/go.sum @@ -246,8 +246,6 @@ github.com/hashicorp/go-msgpack v0.5.4 h1:SFT72YqIkOcLdWJUYcriVX7hbrZpwc/f7h8aW2 github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.3.0 h1:4d/wJojzvHV1I4i/rrjVaeuyxWrLzDE1mDCyDy8fXS8= -github.com/hashicorp/go-plugin v1.3.0/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYtXdgmf1AVNs0= github.com/hashicorp/go-retryablehttp v0.5.2 h1:AoISa4P4IsW0/m4T6St8Yw38gTl5GtBAgfkhYh1xAz4= github.com/hashicorp/go-retryablehttp v0.5.2/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= @@ -384,8 +382,6 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/panicwrap v1.0.0 h1:67zIyVakCIvcs69A0FGfZjBdPleaonSgGlXRSRlb6fE= github.com/mitchellh/panicwrap v1.0.0/go.mod h1:pKvZHwWrZowLUzftuFq7coarnxbBXU4aQh3N0BJOeeA= -github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51 h1:eD92Am0Qf3rqhsOeA1zwBHSfRkoHrt4o6uORamdmJP8= -github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= diff --git a/main.go b/main.go index 33d39e323..f56be6f3f 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "encoding/json" "fmt" - "io" "io/ioutil" "log" "net" @@ -11,7 +10,6 @@ import ( "path/filepath" "runtime" "strings" - "sync" "github.com/hashicorp/go-plugin" "github.com/hashicorp/terraform-svchost/disco" @@ -21,12 +19,10 @@ import ( "github.com/hashicorp/terraform/httpclient" "github.com/hashicorp/terraform/internal/logging" "github.com/hashicorp/terraform/version" - "github.com/mattn/go-colorable" "github.com/mattn/go-shellwords" "github.com/mitchellh/cli" "github.com/mitchellh/colorstring" "github.com/mitchellh/panicwrap" - "github.com/mitchellh/prefixedio" backendInit "github.com/hashicorp/terraform/backend/init" ) @@ -59,15 +55,8 @@ func realMain() int { defer os.Remove(logTempFile.Name()) defer logTempFile.Close() - // Setup the prefixed readers that send data properly to - // stdout/stderr. - doneCh := make(chan struct{}) - outR, outW := io.Pipe() - go copyOutput(outR, doneCh) - // Create the configuration for panicwrap and wrap our executable wrapConfig.Handler = logging.PanicHandler(logTempFile) - wrapConfig.Stdout = outW wrapConfig.IgnoreSignals = ignoreSignals wrapConfig.ForwardSignals = forwardSignals exitStatus, err := panicwrap.Wrap(&wrapConfig) @@ -76,20 +65,7 @@ func realMain() int { return 1 } - // If >= 0, we're the parent, so just exit - if exitStatus >= 0 { - // Close the stdout writer so that our copy process can finish - outW.Close() - - // Wait for the output copying to finish - <-doneCh - - return exitStatus - } - - // We're the child, so just close the tempfile we made in order to - // save file handles since the tempfile is only used by the parent. - logTempFile.Close() + return exitStatus } // Call the real main @@ -97,15 +73,10 @@ func realMain() int { } func init() { - Ui = &cli.PrefixedUi{ - AskPrefix: OutputPrefix, - OutputPrefix: OutputPrefix, - InfoPrefix: OutputPrefix, - ErrorPrefix: ErrorPrefix, - Ui: &cli.BasicUi{ - Writer: os.Stdout, - Reader: os.Stdin, - }, + Ui = &cli.BasicUi{ + Writer: os.Stdout, + ErrorWriter: os.Stderr, + Reader: os.Stdin, } } @@ -299,65 +270,6 @@ func wrappedMain() int { return exitCode } -// copyOutput uses output prefixes to determine whether data on stdout -// should go to stdout or stderr. This is due to panicwrap using stderr -// as the log and error channel. -func copyOutput(r io.Reader, doneCh chan<- struct{}) { - defer close(doneCh) - - pr, err := prefixedio.NewReader(r) - if err != nil { - panic(err) - } - - stderrR, err := pr.Prefix(ErrorPrefix) - if err != nil { - panic(err) - } - stdoutR, err := pr.Prefix(OutputPrefix) - if err != nil { - panic(err) - } - defaultR, err := pr.Prefix("") - if err != nil { - panic(err) - } - - var stdout io.Writer = os.Stdout - var stderr io.Writer = os.Stderr - - if runtime.GOOS == "windows" { - stdout = colorable.NewColorableStdout() - stderr = colorable.NewColorableStderr() - - // colorable is not concurrency-safe when stdout and stderr are the - // same console, so we need to add some synchronization to ensure that - // we can't be concurrently writing to both stderr and stdout at - // once, or else we get intermingled writes that create gibberish - // in the console. - wrapped := synchronizedWriters(stdout, stderr) - stdout = wrapped[0] - stderr = wrapped[1] - } - - var wg sync.WaitGroup - wg.Add(3) - go func() { - defer wg.Done() - io.Copy(stderr, stderrR) - }() - go func() { - defer wg.Done() - io.Copy(stdout, stdoutR) - }() - go func() { - defer wg.Done() - io.Copy(stdout, defaultR) - }() - - wg.Wait() -} - func mergeEnvArgs(envName string, cmd string, args []string) ([]string, error) { v := os.Getenv(envName) if v == "" {