limit expand env to cmd pkg-config & llvm-config
This commit is contained in:
43
xtool/env/env.go
vendored
43
xtool/env/env.go
vendored
@@ -17,32 +17,49 @@
|
|||||||
package env
|
package env
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
reSubcmd = regexp.MustCompile(`\$\([^)]+\)`)
|
||||||
|
reFlag = regexp.MustCompile(`[^ \t\n]+`)
|
||||||
|
)
|
||||||
|
|
||||||
func ExpandEnv(s string) string {
|
func ExpandEnv(s string) string {
|
||||||
return expandEnvWithCmd(s)
|
return expandEnvWithCmd(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func expandEnvWithCmd(s string) string {
|
func expandEnvWithCmd(s string) string {
|
||||||
re := regexp.MustCompile(`\$\(([^)]+)\)`)
|
expanded := reSubcmd.ReplaceAllStringFunc(s, func(m string) string {
|
||||||
expanded := re.ReplaceAllStringFunc(s, func(m string) string {
|
subcmd := strings.TrimSpace(s[2 : len(s)-1])
|
||||||
cmd := re.FindStringSubmatch(m)[1]
|
|
||||||
var out []byte
|
args := parseSubcmd(subcmd)
|
||||||
var err error
|
|
||||||
if runtime.GOOS == "windows" {
|
cmd := args[0]
|
||||||
out, err = exec.Command("cmd", "/C", cmd).Output()
|
|
||||||
} else {
|
if cmd != "pkg-config" && cmd != "llvm-config" {
|
||||||
out, err = exec.Command("sh", "-c", cmd).Output()
|
fmt.Fprintf(os.Stderr, "expand cmd only support pkg-config and llvm-config: '%s'\n", subcmd)
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(string(out))
|
|
||||||
|
var out []byte
|
||||||
|
var err error
|
||||||
|
out, err = exec.Command(cmd, args[1:]...).Output()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
// TODO(kindy): log in verbose mode
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(out)
|
||||||
})
|
})
|
||||||
return os.Expand(expanded, os.Getenv)
|
return os.Expand(expanded, os.Getenv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseSubcmd(s string) []string {
|
||||||
|
return reFlag.FindAllString(s, -1)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user