sg: add --sgtail to start command (#58434)

This commit is contained in:
Jean-Hadrien Chabran 2023-11-21 11:13:49 +01:00 committed by GitHub
parent 4b2e494ca2
commit dd29aab51d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 10 deletions

View File

@ -2,7 +2,9 @@ package run
import (
"context"
"fmt"
"io"
"net"
"os/exec"
"github.com/sourcegraph/conc/pool"
@ -160,6 +162,14 @@ func getSecrets(ctx context.Context, name string, extSecrets map[string]secrets.
return secretsEnv, errs
}
var sgConn net.Conn
func OpenUnixSocket() error {
var err error
sgConn, err = net.Dial("unix", "/tmp/sg.sock")
return err
}
func startCmd(ctx context.Context, dir string, cmd Command, parentEnv map[string]string) (*startedCmd, error) {
sc := &startedCmd{
stdoutBuf: &prefixSuffixSaver{N: 32 << 10},
@ -182,17 +192,40 @@ func startCmd(ctx context.Context, dir string, cmd Command, parentEnv map[string
var stdoutWriter, stderrWriter io.Writer
logger := newCmdLogger(commandCtx, cmd.Name, std.Out.Output)
if cmd.IgnoreStdout {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stdout of %s", cmd.Name))
stdoutWriter = sc.stdoutBuf
// TODO(JH) sgtail experiment going on, this is a bit ugly, that will do it
// for the demo day.
if sgConn != nil {
sink := func(data string) {
sgConn.Write([]byte(fmt.Sprintf("%s: %s\n", cmd.Name, data)))
}
sgConnLog := process.NewLogger(ctx, sink)
if cmd.IgnoreStdout {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stdout of %s", cmd.Name))
stdoutWriter = sc.stdoutBuf
} else {
stdoutWriter = io.MultiWriter(logger, sc.stdoutBuf, sgConnLog)
}
if cmd.IgnoreStderr {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stderr of %s", cmd.Name))
stderrWriter = sc.stderrBuf
} else {
stderrWriter = io.MultiWriter(logger, sc.stderrBuf, sgConnLog)
}
} else {
stdoutWriter = io.MultiWriter(logger, sc.stdoutBuf)
}
if cmd.IgnoreStderr {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stderr of %s", cmd.Name))
stderrWriter = sc.stderrBuf
} else {
stderrWriter = io.MultiWriter(logger, sc.stderrBuf)
if cmd.IgnoreStdout {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stdout of %s", cmd.Name))
stdoutWriter = sc.stdoutBuf
} else {
stdoutWriter = io.MultiWriter(logger, sc.stdoutBuf)
}
if cmd.IgnoreStderr {
std.Out.WriteLine(output.Styledf(output.StyleSuggestion, "Ignoring stderr of %s", cmd.Name))
stderrWriter = sc.stderrBuf
} else {
stderrWriter = io.MultiWriter(logger, sc.stderrBuf)
}
}
if cmd.Preamble != "" {

View File

@ -8,6 +8,7 @@ import (
"path/filepath"
"sort"
"strings"
"sync"
"time"
"github.com/sourcegraph/conc/pool"
@ -85,6 +86,10 @@ sg start -describe single-program
Name: "describe",
Usage: "Print details about the selected commandset",
},
&cli.BoolFlag{
Name: "sgtail",
Usage: "Connects to running sgtail instance",
},
&cli.StringSliceFlag{
Name: "debug",
@ -173,6 +178,8 @@ func constructStartCmdLongHelp() string {
return out.String()
}
var sgOnce sync.Once
func startExec(ctx *cli.Context) error {
config, err := getConfig()
if err != nil {
@ -204,6 +211,12 @@ func startExec(ctx *cli.Context) error {
return errors.New("no concurrent sg start with same arguments allowed")
}
if ctx.Bool("sgtail") {
if err := run.OpenUnixSocket(); err != nil {
return errors.Wrapf(err, "Did you forget to run sgtail first?")
}
}
commandset := args[0]
set, ok := config.Commandsets[commandset]
if !ok {