-
Notifications
You must be signed in to change notification settings - Fork 168
/
gradle_env.go
139 lines (128 loc) · 3.5 KB
/
gradle_env.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package gradle
import (
"context"
"errors"
"fmt"
"github.com/murphysecurity/murphysec/env"
"github.com/murphysecurity/murphysec/infra/logctx"
"github.com/murphysecurity/murphysec/utils"
"os"
"os/exec"
"strings"
)
//goland:noinspection GoNameStartsWithPackageName
type GradleEnv struct {
Version GradleVersion `json:"version"`
Path string `json:"path,omitempty"`
GradleWrapperStatus GradleWrapperStatus `json:"gradle_wrapper_status"`
GradleWrapperError error `json:"gradle_wrapper_error,omitempty"`
}
func (g *GradleEnv) ExecuteContext(ctx context.Context, args ...string) *exec.Cmd {
var _args = make([]string, 0, len(args)+8)
_args = append(_args, "--quiet", "--console", "plain")
_args = append(_args, args...)
c := exec.CommandContext(ctx, g.Path, _args...)
utils.UseLogger(ctx).Sugar().Infof("Prepare: %s", c.String())
return c
}
func DetectGradleEnv(ctx context.Context, dir string) (*GradleEnv, error) {
var log = utils.UseLogger(ctx).Sugar()
var r = &GradleEnv{GradleWrapperStatus: GradleWrapperStatusNotDetected}
if script := prepareGradleWrapperScriptFile(ctx, dir); script != "" {
gv, e := evalVersion(ctx, script)
if e == nil {
return &GradleEnv{
Version: *gv,
Path: script,
GradleWrapperStatus: GradleWrapperStatusUsed,
}, nil
}
log.Errorf("Eval gradle wrapper: %s", e.Error())
r.GradleWrapperError = e
r.GradleWrapperStatus = GradleWrapperStatusError
}
gv, e := evalVersion(ctx, "gradle")
if e != nil {
log.Errorf("Eval gradle: %s", e.Error())
return nil, e
}
r.Version = *gv
r.Path = "gradle"
return r, nil
}
func evalVersion(ctx context.Context, cmdPath string) (_ *GradleVersion, err error) {
defer func() {
err = evalVersionError(err)
}()
var log = utils.UseLogger(ctx).Sugar()
cmd := exec.CommandContext(ctx, cmdPath, "--version", "--quiet")
cmd = fixGradleCommandEnv(ctx, cmd)
log.Infof("Execute: %s", cmd.String())
data, e := cmd.Output()
if e != nil {
var exitErr *exec.ExitError
if errors.As(e, &exitErr) {
data := exitErr.Stderr
if len(data) > 256 {
data = data[:256]
}
return nil, &EvalVersionError{
_Error: e,
ExitCode: exitErr.ExitCode(),
Stderr: string(data),
}
}
return nil, e
}
return parseGradleVersionOutput(string(data))
}
func evalVersionError(e error) error {
if e == nil {
return nil
}
var exitErr *exec.ExitError
if errors.As(e, &exitErr) {
data := exitErr.Stderr
if len(data) > 256 {
data = data[:256]
}
return &EvalVersionError{
_Error: e,
ExitCode: exitErr.ExitCode(),
Stderr: string(data),
}
}
return &EvalVersionError{_Error: e}
}
func fixGradleCommandEnv(ctx context.Context, cmd *exec.Cmd) *exec.Cmd {
if env.IdeaMavenJre != "" {
if cmd.Env == nil {
for _, it := range os.Environ() {
if strings.HasPrefix(it, "JAVA_HOME=") {
continue
}
cmd.Env = append(cmd.Env, it)
}
}
cmd.Env = append(cmd.Env, "JAVA_HOME="+env.IdeaMavenJre)
logctx.Use(ctx).Sugar().Debugf("adjust JAVA_HOME environment by IDEA_MAVEN_JRE")
}
return cmd
}
type EvalVersionError struct {
_Error error
ExitCode int `json:"exit_code"`
Stderr string `json:"stderr"`
}
func (e *EvalVersionError) Unwrap() error {
return e._Error
}
func (e *EvalVersionError) Error() string {
if e.Stderr == "" {
return e._Error.Error()
}
return fmt.Sprintf("%s, output: \n%s", e._Error.Error(), e.Stderr)
}
func (e *EvalVersionError) Is(target error) bool {
return target == ErrEvalGradleVersion
}