Skip to content

Commit 9a1b182

Browse files
committed
Fix search
1 parent 18e5247 commit 9a1b182

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

coderd/httpapi/search.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ func WorkspaceSearchQuery(query string) (map[string]string, error) {
1313
if query == "" {
1414
return searchParams, nil
1515
}
16-
elements := splitElements(query, ' ')
16+
// Because we do this in 2 passes, we want to maintain quotes on the first
17+
// pass.Further splitting occurs on the second pass and quotes will be
18+
// dropped.
19+
elements := splitElements(query, ' ', true)
1720
for _, element := range elements {
18-
parts := splitElements(query, ':')
21+
parts := splitElements(element, ':', false)
1922
switch len(parts) {
2023
case 1:
2124
// No key:value pair. It is a workspace name, and maybe includes an owner
22-
parts = splitElements(query, '/')
25+
parts = splitElements(element, '/', false)
2326
switch len(parts) {
2427
case 1:
2528
searchParams["name"] = parts[0]
@@ -48,14 +51,17 @@ func WorkspaceSearchQuery(query string) (map[string]string, error) {
4851
// can properly fail on the space. If we do not, a value of `template:"my name"`
4952
// will search `template:"my name:name"`, which produces an empty list instead of
5053
// an error.
51-
func splitElements(query string, delimiter rune) []string {
54+
func splitElements(query string, delimiter rune, maintainQuotes bool) []string {
5255
var parts []string
5356

5457
quoted := false
5558
var current strings.Builder
5659
for _, c := range query {
5760
switch c {
5861
case '"':
62+
if maintainQuotes {
63+
_, _ = current.WriteRune(c)
64+
}
5965
quoted = !quoted
6066
case delimiter:
6167
if quoted {

coderd/httpapi/search_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,21 @@ func TestSearchWorkspace(t *testing.T) {
9292
"key:is:wild/a/b/c": "foo:bar/baz/zoo:zonk",
9393
},
9494
},
95+
{
96+
Name: "QuotesName",
97+
Query: `"foo/bar"`,
98+
Expected: map[string]string{
99+
"name": "foo/bar",
100+
},
101+
},
102+
{
103+
Name: "QuotedOwner/Name",
104+
Query: `"foo"/"bar"`,
105+
Expected: map[string]string{
106+
"owner": "foo",
107+
"name": "bar",
108+
},
109+
},
95110

96111
// Failures
97112
{

0 commit comments

Comments
 (0)