Fix endless loop in "expandDoubleQuoted".
Fix an issue with expansion of escaped newlines. Use the currently set mkfile vars as environment vars for the shell command invoked by "expandBackQuoted".
This commit is contained in:
parent
353e1eab5f
commit
a3a923ffe8
3 changed files with 22 additions and 10 deletions
26
expand.go
26
expand.go
|
|
@ -5,6 +5,7 @@ package main
|
|||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"os"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
|
|
@ -89,31 +90,35 @@ func expandEscape(input string) (string, int) {
|
|||
if c == '\t' || c == ' ' {
|
||||
return string(c), w
|
||||
}
|
||||
if c == '\n' {
|
||||
return "", w
|
||||
}
|
||||
return "\\" + string(c), w
|
||||
}
|
||||
|
||||
// Expand a double quoted string starting after a '\"'
|
||||
func expandDoubleQuoted(input string, vars map[string][]string, expandBackticks bool) (string, int) {
|
||||
// find the first non-escaped "
|
||||
i := 0
|
||||
j := 0
|
||||
for {
|
||||
j = strings.IndexAny(input[j:], "\"\\")
|
||||
j = strings.IndexAny(input[i:], "\"\\")
|
||||
if j < 0 {
|
||||
break
|
||||
}
|
||||
j += i
|
||||
|
||||
c, w := utf8.DecodeRuneInString(input[j:])
|
||||
j += w
|
||||
i = j + w
|
||||
|
||||
if c == '"' {
|
||||
return strings.Join(expand(input[:j], vars, expandBackticks), " "), (j + w)
|
||||
return strings.Join(expand(input[:j], vars, expandBackticks), " "), i
|
||||
}
|
||||
|
||||
if c == '\\' {
|
||||
if j+w < len(input) {
|
||||
j += w
|
||||
_, w := utf8.DecodeRuneInString(input[j:])
|
||||
j += w
|
||||
if i < len(input) {
|
||||
_, w := utf8.DecodeRuneInString(input[i:])
|
||||
i += w
|
||||
} else {
|
||||
break
|
||||
}
|
||||
|
|
@ -303,9 +308,14 @@ func expandBackQuoted(input string, vars map[string][]string) ([]string, int) {
|
|||
if j < 0 {
|
||||
return []string{input}, len(input)
|
||||
}
|
||||
|
||||
env := os.Environ()
|
||||
for key, values := range vars {
|
||||
env = append(env, key + "=" + strings.Join(values, " "))
|
||||
}
|
||||
|
||||
// TODO: handle errors
|
||||
output, _ := subprocess("sh", nil, input[:j], true)
|
||||
output, _ := subprocess("sh", nil, env, input[:j], true)
|
||||
|
||||
parts := make([]string, 0)
|
||||
_, tokens := lexWords(output)
|
||||
|
|
|
|||
2
parse.go
2
parse.go
|
|
@ -118,7 +118,7 @@ func parsePipeInclude(p *parser, t token) parserStateFun {
|
|||
args[i] = p.tokenbuf[i].val
|
||||
}
|
||||
|
||||
output, success := subprocess("sh", args, "", true)
|
||||
output, success := subprocess("sh", args, nil, "", true)
|
||||
if !success {
|
||||
p.basicErrorAtToken("subprocess include failed", t)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ func dorecipe(target string, u *node, e *edge, dryrun bool) bool {
|
|||
_, success := subprocess(
|
||||
sh,
|
||||
args,
|
||||
nil,
|
||||
input,
|
||||
false)
|
||||
|
||||
|
|
@ -127,6 +128,7 @@ func dorecipe(target string, u *node, e *edge, dryrun bool) bool {
|
|||
//
|
||||
func subprocess(program string,
|
||||
args []string,
|
||||
env []string,
|
||||
input string,
|
||||
capture_out bool) (string, bool) {
|
||||
program_path, err := exec.LookPath(program)
|
||||
|
|
@ -142,7 +144,7 @@ func subprocess(program string,
|
|||
log.Fatal(err)
|
||||
}
|
||||
|
||||
attr := os.ProcAttr{Files: []*os.File{stdin_pipe_read, os.Stdout, os.Stderr}}
|
||||
attr := os.ProcAttr{Env: env, Files: []*os.File{stdin_pipe_read, os.Stdout, os.Stderr}}
|
||||
|
||||
output := make([]byte, 0)
|
||||
capture_done := make(chan bool)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue