diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-16 19:23:18 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-16 19:23:18 +0000 |
commit | 43a123c1ae6613b3efeed291fa552ecd909d3acf (patch) | |
tree | fd92518b7024bc74031f78a1cf9e454b65e73665 /src/cmd/go/scriptcmds_test.go | |
parent | Initial commit. (diff) | |
download | golang-1.20-43a123c1ae6613b3efeed291fa552ecd909d3acf.tar.xz golang-1.20-43a123c1ae6613b3efeed291fa552ecd909d3acf.zip |
Adding upstream version 1.20.14.upstream/1.20.14upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/cmd/go/scriptcmds_test.go')
-rw-r--r-- | src/cmd/go/scriptcmds_test.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/cmd/go/scriptcmds_test.go b/src/cmd/go/scriptcmds_test.go new file mode 100644 index 0000000..db5e6ca --- /dev/null +++ b/src/cmd/go/scriptcmds_test.go @@ -0,0 +1,109 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main_test + +import ( + "cmd/go/internal/script" + "cmd/go/internal/script/scripttest" + "cmd/go/internal/work" + "errors" + "fmt" + "os" + "os/exec" + "strings" + "time" +) + +func scriptCommands(interrupt os.Signal, waitDelay time.Duration) map[string]script.Cmd { + cmds := scripttest.DefaultCmds() + + // Customize the "exec" interrupt signal and grace period. + var cancel func(cmd *exec.Cmd) error + if interrupt != nil { + cancel = func(cmd *exec.Cmd) error { + return cmd.Process.Signal(interrupt) + } + } + + cmdExec := script.Exec(cancel, waitDelay) + cmds["exec"] = cmdExec + + add := func(name string, cmd script.Cmd) { + if _, ok := cmds[name]; ok { + panic(fmt.Sprintf("command %q is already registered", name)) + } + cmds[name] = cmd + } + + add("cc", scriptCC(cmdExec)) + cmdGo := scriptGo(cancel, waitDelay) + add("go", cmdGo) + add("stale", scriptStale(cmdGo)) + + return cmds +} + +// scriptCC runs the C compiler along with platform specific options. +func scriptCC(cmdExec script.Cmd) script.Cmd { + return script.Command( + script.CmdUsage{ + Summary: "run the platform C compiler", + Args: "args...", + }, + func(s *script.State, args ...string) (script.WaitFunc, error) { + b := work.NewBuilder(s.Getwd()) + wait, err := cmdExec.Run(s, append(b.GccCmd(".", ""), args...)...) + if err != nil { + return wait, err + } + waitAndClean := func(s *script.State) (stdout, stderr string, err error) { + stdout, stderr, err = wait(s) + if closeErr := b.Close(); err == nil { + err = closeErr + } + return stdout, stderr, err + } + return waitAndClean, nil + }) +} + +// scriptGo runs the go command. +func scriptGo(cancel func(*exec.Cmd) error, waitDelay time.Duration) script.Cmd { + return script.Program(testGo, cancel, waitDelay) +} + +// scriptStale checks that the named build targets are stale. +func scriptStale(cmdGo script.Cmd) script.Cmd { + return script.Command( + script.CmdUsage{ + Summary: "check that build targets are stale", + Args: "target...", + }, + func(s *script.State, args ...string) (script.WaitFunc, error) { + if len(args) == 0 { + return nil, script.ErrUsage + } + tmpl := "{{if .Error}}{{.ImportPath}}: {{.Error.Err}}" + + "{{else}}{{if not .Stale}}{{.ImportPath}} ({{.Target}}) is not stale{{end}}" + + "{{end}}" + + wait, err := cmdGo.Run(s, append([]string{"list", "-e", "-f=" + tmpl}, args...)...) + if err != nil { + return nil, err + } + + stdout, stderr, err := wait(s) + if len(stderr) != 0 { + s.Logf("%s", stderr) + } + if err != nil { + return nil, err + } + if out := strings.TrimSpace(stdout); out != "" { + return nil, errors.New(out) + } + return nil, nil + }) +} |