aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2022-05-01 12:30:55 +0200
committerMichael Muré <batolettre@gmail.com>2022-05-01 12:31:50 +0200
commitb9991d84b913577a17635b4ca8863d60cda79c42 (patch)
treed9cb340d571b685c7458c2f3e1fc2f8b1b0664f5
parentedc8b7589dcf1daad65b0e57488a3b3f86711926 (diff)
downloadgit-bug-b9991d84b913577a17635b4ca8863d60cda79c42.tar.gz
ls: fix incorrect query parsing with quotes escaped by the shell
-rw-r--r--commands/ls.go23
-rw-r--r--commands/ls_test.go43
2 files changed, 59 insertions, 7 deletions
diff --git a/commands/ls.go b/commands/ls.go
index 909e25a8..da5ea8ce 100644
--- a/commands/ls.go
+++ b/commands/ls.go
@@ -103,13 +103,9 @@ func runLs(env *Env, opts lsOptions, args []string) error {
var err error
if len(args) >= 1 {
- // either the shell or cobra remove the quotes, we need them back for the parsing
- for i, arg := range args {
- if strings.Contains(arg, " ") {
- args[i] = fmt.Sprintf("\"%s\"", arg)
- }
- }
- assembled := strings.Join(args, " ")
+ // either the shell or cobra remove the quotes, we need them back for the query parsing
+ assembled := repairQuery(args)
+
q, err = query.Parse(assembled)
if err != nil {
return err
@@ -153,6 +149,19 @@ func runLs(env *Env, opts lsOptions, args []string) error {
}
}
+func repairQuery(args []string) string {
+ for i, arg := range args {
+ split := strings.Split(arg, ":")
+ for j, s := range split {
+ if strings.Contains(s, " ") {
+ split[j] = fmt.Sprintf("\"%s\"", s)
+ }
+ }
+ args[i] = strings.Join(split, ":")
+ }
+ return strings.Join(args, " ")
+}
+
type JSONBugExcerpt struct {
Id string `json:"id"`
HumanId string `json:"human_id"`
diff --git a/commands/ls_test.go b/commands/ls_test.go
new file mode 100644
index 00000000..aff94e03
--- /dev/null
+++ b/commands/ls_test.go
@@ -0,0 +1,43 @@
+package commands
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func Test_repairQuery(t *testing.T) {
+ cases := []struct {
+ args []string
+ output string
+ }{
+ {
+ []string{""},
+ "",
+ },
+ {
+ []string{"foo"},
+ "foo",
+ },
+ {
+ []string{"foo", "bar"},
+ "foo bar",
+ },
+ {
+ []string{"foo bar", "baz"},
+ "\"foo bar\" baz",
+ },
+ {
+ []string{"foo:bar", "baz"},
+ "foo:bar baz",
+ },
+ {
+ []string{"foo:bar boo", "baz"},
+ "foo:\"bar boo\" baz",
+ },
+ }
+
+ for _, tc := range cases {
+ require.Equal(t, tc.output, repairQuery(tc.args))
+ }
+}