analysis/app: escape filters containing spaces

Change-Id: Iedf55dbc792d9cc12fc5d2a0a674628eed8ad726
Reviewed-on: https://go-review.googlesource.com/35945
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/analysis/app/compare.go b/analysis/app/compare.go
index 4428a3d..9127879 100644
--- a/analysis/app/compare.go
+++ b/analysis/app/compare.go
@@ -113,6 +113,11 @@
 
 // addToQuery returns a new query string with add applied as a filter.
 func addToQuery(query, add string) string {
+	if strings.ContainsAny(add, " \t\\\"") {
+		add = strings.Replace(add, `\`, `\\`, -1)
+		add = strings.Replace(add, `"`, `\"`, -1)
+		add = `"` + add + `"`
+	}
 	if strings.Contains(query, "|") {
 		return add + " " + query
 	}
diff --git a/analysis/app/compare_test.go b/analysis/app/compare_test.go
index f7f92e9..1728ae0 100644
--- a/analysis/app/compare_test.go
+++ b/analysis/app/compare_test.go
@@ -111,3 +111,23 @@
 		})
 	}
 }
+
+func TestAddToQuery(t *testing.T) {
+	tests := []struct {
+		query, add string
+		want       string
+	}{
+		{"one", "two", "two | one"},
+		{"pre | one vs two", "three", "three pre | one vs two"},
+		{"four", "five six", `"five six" | four`},
+		{"seven", `extra "fun"\problem`, `"extra \"fun\"\\problem" | seven`},
+		{"eight", `ni\"ne`, `"ni\\\"ne" | eight`},
+	}
+	for i, test := range tests {
+		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
+			if got := addToQuery(test.query, test.add); got != test.want {
+				t.Errorf("addToQuery(%q, %q) = %q, want %q", test.query, test.add, got, test.want)
+			}
+		})
+	}
+}