From fd4f7eb0b935e5a838810564fd549afe710ae19a Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 21 Oct 2020 13:06:23 -0400 Subject: [PATCH] remove prefixed io The main process is now handling what output to print, so it doesn't do any good to try and run it through prefixedio, which is only adding extra coordination to echo the same data. --- go.mod | 3 +- go.sum | 4 --- main.go | 98 +++------------------------------------------------------ 3 files changed, 6 insertions(+), 99 deletions(-) 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 == "" {