...
1
2
3
4
5
6 package gh
7
8 import (
9 "bytes"
10 "context"
11 "fmt"
12 "io"
13 "os"
14 "os/exec"
15
16 "github.com/cli/safeexec"
17 )
18
19
20 func Exec(args ...string) (stdout, stderr bytes.Buffer, err error) {
21 ghExe, err := Path()
22 if err != nil {
23 return
24 }
25 err = run(context.Background(), ghExe, nil, nil, &stdout, &stderr, args)
26 return
27 }
28
29
30 func ExecContext(ctx context.Context, args ...string) (stdout, stderr bytes.Buffer, err error) {
31 ghExe, err := Path()
32 if err != nil {
33 return
34 }
35 err = run(ctx, ghExe, nil, nil, &stdout, &stderr, args)
36 return
37 }
38
39
40
41 func ExecInteractive(ctx context.Context, args ...string) error {
42 ghExe, err := Path()
43 if err != nil {
44 return err
45 }
46 return run(ctx, ghExe, nil, os.Stdin, os.Stdout, os.Stderr, args)
47 }
48
49
50
51 func Path() (string, error) {
52 if ghExe := os.Getenv("GH_PATH"); ghExe != "" {
53 return ghExe, nil
54 }
55 return safeexec.LookPath("gh")
56 }
57
58 func run(ctx context.Context, ghExe string, env []string, stdin io.Reader, stdout, stderr io.Writer, args []string) error {
59 cmd := exec.CommandContext(ctx, ghExe, args...)
60 cmd.Stdin = stdin
61 cmd.Stdout = stdout
62 cmd.Stderr = stderr
63 if env != nil {
64 cmd.Env = env
65 }
66 if err := cmd.Run(); err != nil {
67 return fmt.Errorf("gh execution failed: %w", err)
68 }
69 return nil
70 }
71
View as plain text