summaryrefslogtreecommitdiff
path: root/vendor/github.com/mattn/go-shellwords
diff options
context:
space:
mode:
authorValentin Rothberg <rothberg@redhat.com>2019-06-24 11:29:13 +0200
committerValentin Rothberg <rothberg@redhat.com>2019-06-24 13:20:59 +0200
commitd697456dc90adbaf68224ed7c115b38d5855e582 (patch)
tree5fd88c48b34e7bead0028fa97e39f43f03880642 /vendor/github.com/mattn/go-shellwords
parenta3211b73c62a9fcc13f09305bf629ef507b26d34 (diff)
downloadpodman-d697456dc90adbaf68224ed7c115b38d5855e582.tar.gz
podman-d697456dc90adbaf68224ed7c115b38d5855e582.tar.bz2
podman-d697456dc90adbaf68224ed7c115b38d5855e582.zip
migrate to go-modules
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'vendor/github.com/mattn/go-shellwords')
-rw-r--r--vendor/github.com/mattn/go-shellwords/.travis.yml8
-rw-r--r--vendor/github.com/mattn/go-shellwords/LICENSE21
-rw-r--r--vendor/github.com/mattn/go-shellwords/README.md47
-rw-r--r--vendor/github.com/mattn/go-shellwords/go.mod1
-rw-r--r--vendor/github.com/mattn/go-shellwords/shellwords.go195
-rw-r--r--vendor/github.com/mattn/go-shellwords/util_go15.go24
-rw-r--r--vendor/github.com/mattn/go-shellwords/util_posix.go22
-rw-r--r--vendor/github.com/mattn/go-shellwords/util_windows.go22
8 files changed, 340 insertions, 0 deletions
diff --git a/vendor/github.com/mattn/go-shellwords/.travis.yml b/vendor/github.com/mattn/go-shellwords/.travis.yml
new file mode 100644
index 000000000..16d1430aa
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/.travis.yml
@@ -0,0 +1,8 @@
+language: go
+go:
+ - tip
+before_install:
+ - go get github.com/mattn/goveralls
+ - go get golang.org/x/tools/cmd/cover
+script:
+ - $HOME/gopath/bin/goveralls -repotoken 2FMhp57u8LcstKL9B190fLTcEnBtAAiEL
diff --git a/vendor/github.com/mattn/go-shellwords/LICENSE b/vendor/github.com/mattn/go-shellwords/LICENSE
new file mode 100644
index 000000000..740fa9313
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Yasuhiro Matsumoto
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/mattn/go-shellwords/README.md b/vendor/github.com/mattn/go-shellwords/README.md
new file mode 100644
index 000000000..b1d235c78
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/README.md
@@ -0,0 +1,47 @@
+# go-shellwords
+
+[![Coverage Status](https://coveralls.io/repos/mattn/go-shellwords/badge.png?branch=master)](https://coveralls.io/r/mattn/go-shellwords?branch=master)
+[![Build Status](https://travis-ci.org/mattn/go-shellwords.svg?branch=master)](https://travis-ci.org/mattn/go-shellwords)
+
+Parse line as shell words.
+
+## Usage
+
+```go
+args, err := shellwords.Parse("./foo --bar=baz")
+// args should be ["./foo", "--bar=baz"]
+```
+
+```go
+os.Setenv("FOO", "bar")
+p := shellwords.NewParser()
+p.ParseEnv = true
+args, err := p.Parse("./foo $FOO")
+// args should be ["./foo", "bar"]
+```
+
+```go
+p := shellwords.NewParser()
+p.ParseBacktick = true
+args, err := p.Parse("./foo `echo $SHELL`")
+// args should be ["./foo", "/bin/bash"]
+```
+
+```go
+shellwords.ParseBacktick = true
+p := shellwords.NewParser()
+args, err := p.Parse("./foo `echo $SHELL`")
+// args should be ["./foo", "/bin/bash"]
+```
+
+# Thanks
+
+This is based on cpan module [Parse::CommandLine](https://metacpan.org/pod/Parse::CommandLine).
+
+# License
+
+under the MIT License: http://mattn.mit-license.org/2017
+
+# Author
+
+Yasuhiro Matsumoto (a.k.a mattn)
diff --git a/vendor/github.com/mattn/go-shellwords/go.mod b/vendor/github.com/mattn/go-shellwords/go.mod
new file mode 100644
index 000000000..8d96dbd5f
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/go.mod
@@ -0,0 +1 @@
+module github.com/mattn/go-shellwords
diff --git a/vendor/github.com/mattn/go-shellwords/shellwords.go b/vendor/github.com/mattn/go-shellwords/shellwords.go
new file mode 100644
index 000000000..41429d8f2
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/shellwords.go
@@ -0,0 +1,195 @@
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "regexp"
+ "strings"
+)
+
+var (
+ ParseEnv bool = false
+ ParseBacktick bool = false
+)
+
+var envRe = regexp.MustCompile(`\$({[a-zA-Z0-9_]+}|[a-zA-Z0-9_]+)`)
+
+func isSpace(r rune) bool {
+ switch r {
+ case ' ', '\t', '\r', '\n':
+ return true
+ }
+ return false
+}
+
+func replaceEnv(getenv func(string) string, s string) string {
+ if getenv == nil {
+ getenv = os.Getenv
+ }
+
+ return envRe.ReplaceAllStringFunc(s, func(s string) string {
+ s = s[1:]
+ if s[0] == '{' {
+ s = s[1 : len(s)-1]
+ }
+ return getenv(s)
+ })
+}
+
+type Parser struct {
+ ParseEnv bool
+ ParseBacktick bool
+ Position int
+
+ // If ParseEnv is true, use this for getenv.
+ // If nil, use os.Getenv.
+ Getenv func(string) string
+}
+
+func NewParser() *Parser {
+ return &Parser{
+ ParseEnv: ParseEnv,
+ ParseBacktick: ParseBacktick,
+ Position: 0,
+ }
+}
+
+func (p *Parser) Parse(line string) ([]string, error) {
+ args := []string{}
+ buf := ""
+ var escaped, doubleQuoted, singleQuoted, backQuote, dollarQuote bool
+ backtick := ""
+
+ pos := -1
+ got := false
+
+loop:
+ for i, r := range line {
+ if escaped {
+ buf += string(r)
+ escaped = false
+ continue
+ }
+
+ if r == '\\' {
+ if singleQuoted {
+ buf += string(r)
+ } else {
+ escaped = true
+ }
+ continue
+ }
+
+ if isSpace(r) {
+ if singleQuoted || doubleQuoted || backQuote || dollarQuote {
+ buf += string(r)
+ backtick += string(r)
+ } else if got {
+ if p.ParseEnv {
+ buf = replaceEnv(p.Getenv, buf)
+ }
+ args = append(args, buf)
+ buf = ""
+ got = false
+ }
+ continue
+ }
+
+ switch r {
+ case '`':
+ if !singleQuoted && !doubleQuoted && !dollarQuote {
+ if p.ParseBacktick {
+ if backQuote {
+ out, err := shellRun(backtick)
+ if err != nil {
+ return nil, err
+ }
+ buf = out
+ }
+ backtick = ""
+ backQuote = !backQuote
+ continue
+ }
+ backtick = ""
+ backQuote = !backQuote
+ }
+ case ')':
+ if !singleQuoted && !doubleQuoted && !backQuote {
+ if p.ParseBacktick {
+ if dollarQuote {
+ out, err := shellRun(backtick)
+ if err != nil {
+ return nil, err
+ }
+ if r == ')' {
+ buf = buf[:len(buf)-len(backtick)-2] + out
+ } else {
+ buf = buf[:len(buf)-len(backtick)-1] + out
+ }
+ }
+ backtick = ""
+ dollarQuote = !dollarQuote
+ continue
+ }
+ backtick = ""
+ dollarQuote = !dollarQuote
+ }
+ case '(':
+ if !singleQuoted && !doubleQuoted && !backQuote {
+ if !dollarQuote && strings.HasSuffix(buf, "$") {
+ dollarQuote = true
+ buf += "("
+ continue
+ } else {
+ return nil, errors.New("invalid command line string")
+ }
+ }
+ case '"':
+ if !singleQuoted && !dollarQuote {
+ doubleQuoted = !doubleQuoted
+ continue
+ }
+ case '\'':
+ if !doubleQuoted && !dollarQuote {
+ singleQuoted = !singleQuoted
+ continue
+ }
+ case ';', '&', '|', '<', '>':
+ if !(escaped || singleQuoted || doubleQuoted || backQuote) {
+ if r == '>' && len(buf) > 0 {
+ if c := buf[0]; '0' <= c && c <= '9' {
+ i -= 1
+ got = false
+ }
+ }
+ pos = i
+ break loop
+ }
+ }
+
+ got = true
+ buf += string(r)
+ if backQuote || dollarQuote {
+ backtick += string(r)
+ }
+ }
+
+ if got {
+ if p.ParseEnv {
+ buf = replaceEnv(p.Getenv, buf)
+ }
+ args = append(args, buf)
+ }
+
+ if escaped || singleQuoted || doubleQuoted || backQuote || dollarQuote {
+ return nil, errors.New("invalid command line string")
+ }
+
+ p.Position = pos
+
+ return args, nil
+}
+
+func Parse(line string) ([]string, error) {
+ return NewParser().Parse(line)
+}
diff --git a/vendor/github.com/mattn/go-shellwords/util_go15.go b/vendor/github.com/mattn/go-shellwords/util_go15.go
new file mode 100644
index 000000000..180f00f0b
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/util_go15.go
@@ -0,0 +1,24 @@
+// +build !go1.6
+
+package shellwords
+
+import (
+ "os"
+ "os/exec"
+ "runtime"
+ "strings"
+)
+
+func shellRun(line string) (string, error) {
+ var b []byte
+ var err error
+ if runtime.GOOS == "windows" {
+ b, err = exec.Command(os.Getenv("COMSPEC"), "/c", line).Output()
+ } else {
+ b, err = exec.Command(os.Getenv("SHELL"), "-c", line).Output()
+ }
+ if err != nil {
+ return "", err
+ }
+ return strings.TrimSpace(string(b)), nil
+}
diff --git a/vendor/github.com/mattn/go-shellwords/util_posix.go b/vendor/github.com/mattn/go-shellwords/util_posix.go
new file mode 100644
index 000000000..eaf1011d6
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/util_posix.go
@@ -0,0 +1,22 @@
+// +build !windows,go1.6
+
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+ "strings"
+)
+
+func shellRun(line string) (string, error) {
+ shell := os.Getenv("SHELL")
+ b, err := exec.Command(shell, "-c", line).Output()
+ if err != nil {
+ if eerr, ok := err.(*exec.ExitError); ok {
+ b = eerr.Stderr
+ }
+ return "", errors.New(err.Error() + ":" + string(b))
+ }
+ return strings.TrimSpace(string(b)), nil
+}
diff --git a/vendor/github.com/mattn/go-shellwords/util_windows.go b/vendor/github.com/mattn/go-shellwords/util_windows.go
new file mode 100644
index 000000000..e46f89a1f
--- /dev/null
+++ b/vendor/github.com/mattn/go-shellwords/util_windows.go
@@ -0,0 +1,22 @@
+// +build windows,go1.6
+
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+ "strings"
+)
+
+func shellRun(line string) (string, error) {
+ shell := os.Getenv("COMSPEC")
+ b, err := exec.Command(shell, "/c", line).Output()
+ if err != nil {
+ if eerr, ok := err.(*exec.ExitError); ok {
+ b = eerr.Stderr
+ }
+ return "", errors.New(err.Error() + ":" + string(b))
+ }
+ return strings.TrimSpace(string(b)), nil
+}