update deps

This commit is contained in:
Andrey Nering
2017-06-16 14:59:12 -03:00
parent 4f928e7570
commit 81d221667b
30 changed files with 316 additions and 40 deletions

View File

@@ -142,21 +142,20 @@ func (r *Runner) builtinCode(pos syntax.Pos, name string, args []string) int {
case "pwd":
r.outf("%s\n", r.getVar("PWD"))
case "cd":
if len(args) > 1 {
var dir string
switch len(args) {
case 0:
dir = r.getVar("HOME")
case 1:
dir = args[0]
default:
r.errf("usage: cd [dir]\n")
return 2
}
var dir string
if len(args) == 0 {
dir = r.getVar("HOME")
} else {
dir = args[0]
}
if !filepath.IsAbs(dir) {
dir = filepath.Join(r.Dir, dir)
}
_, err := os.Stat(dir)
if err != nil {
if _, err := os.Stat(dir); err != nil {
return 1
}
r.Dir = dir

View File

@@ -232,33 +232,47 @@ func fieldJoin(parts []fieldPart) string {
return buf.String()
}
func escapeQuotedParts(parts []fieldPart) string {
func escapedGlob(parts []fieldPart) (escaped string, glob bool) {
var buf bytes.Buffer
for _, part := range parts {
if !part.quoted {
buf.WriteString(part.val)
continue
}
for _, r := range part.val {
switch r {
case '*', '?', '\\', '[':
buf.WriteByte('\\')
if part.quoted {
buf.WriteByte('\\')
} else {
glob = true
}
}
buf.WriteRune(r)
}
}
return buf.String()
return buf.String(), glob
}
func (r *Runner) fields(words []*syntax.Word) []string {
fields := make([]string, 0, len(words))
baseDir, _ := escapedGlob([]fieldPart{{val: r.Dir}})
for _, word := range words {
for _, field := range r.wordFields(word.Parts, false) {
matches, _ := filepath.Glob(escapeQuotedParts(field))
if len(matches) > 0 {
fields = append(fields, matches...)
} else {
path, glob := escapedGlob(field)
var matches []string
abs := filepath.IsAbs(path)
if glob {
if !abs {
path = filepath.Join(baseDir, path)
}
matches, _ = filepath.Glob(path)
}
if len(matches) == 0 {
fields = append(fields, fieldJoin(field))
continue
}
for _, match := range matches {
if !abs {
match, _ = filepath.Rel(baseDir, match)
}
fields = append(fields, match)
}
}
}
@@ -494,7 +508,8 @@ func (r *Runner) cmd(cm syntax.Command) {
for _, word := range ci.Patterns {
var buf bytes.Buffer
for _, field := range r.wordFields(word.Parts, false) {
buf.WriteString(escapeQuotedParts(field))
escaped, _ := escapedGlob(field)
buf.WriteString(escaped)
}
if match(buf.String(), str) {
r.stmts(ci.Stmts)

View File

@@ -27,7 +27,8 @@ func (r *Runner) bashTest(expr syntax.TestExpr) string {
var buf bytes.Buffer
yw := x.Y.(*syntax.Word)
for _, field := range r.wordFields(yw.Parts, false) {
buf.WriteString(escapeQuotedParts(field))
escaped, _ := escapedGlob(field)
buf.WriteString(escaped)
}
if match(buf.String(), str) == (x.Op == syntax.TsMatch) {
return "1"

View File

@@ -251,12 +251,18 @@ func (u *UUID) UnmarshalText(text []byte) (err error) {
b := u[:]
for i, byteGroup := range byteGroups {
if i > 0 {
if t[0] != '-' {
err = fmt.Errorf("uuid: invalid string format")
if i > 0 && t[0] == '-' {
t = t[1:]
} else if i > 0 && t[0] != '-' {
err = fmt.Errorf("uuid: invalid string format")
return
}
if i == 2 {
if !bytes.Contains([]byte("012345"), []byte{t[0]}) {
err = fmt.Errorf("uuid: invalid version number: %s", t[0])
return
}
t = t[1:]
}
if len(t) < byteGroup {
@@ -266,11 +272,12 @@ func (u *UUID) UnmarshalText(text []byte) (err error) {
if i == 4 && len(t) > byteGroup &&
((braced && t[byteGroup] != '}') || len(t[byteGroup:]) > 1 || !braced) {
err = fmt.Errorf("uuid: UUID string too long: %s", text)
err = fmt.Errorf("uuid: UUID string too long: %s", t)
return
}
_, err = hex.Decode(b[:byteGroup/2], t[:byteGroup])
if err != nil {
return
}