web: always enable print mode

Use default print if external browsing is not available.

Change-Id: Ib3b0e64e8a9835491995de4d1b4b42eb74d19cd4
diff --git a/web/e2e_test.go b/web/e2e_test.go
index 1c377cf..9ce8702 100644
--- a/web/e2e_test.go
+++ b/web/e2e_test.go
@@ -118,30 +118,8 @@
 			`value=magic`,
 		},
 	} {
-		res, err := http.Get(ts.URL + req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		resultBytes, err := ioutil.ReadAll(res.Body)
-		res.Body.Close()
-		if err != nil {
-			log.Fatal(err)
-		}
-
-		result := string(resultBytes)
-		for _, want := range needles {
-			if !strings.Contains(result, want) {
-				t.Errorf("query %q: result did not have %q: %s", req, want, result)
-			}
-		}
-		if notWant := "crashed"; strings.Contains(result, notWant) {
-			t.Errorf("result has %q: %s", notWant, result)
-		}
-		if notWant := "bytes skipped)..."; strings.Contains(result, notWant) {
-			t.Errorf("result has %q: %s", notWant, result)
-		}
+		checkNeedles(t, ts, req, needles)
 	}
-
 }
 
 func TestPrint(t *testing.T) {
@@ -193,28 +171,72 @@
 			`pre id="l1" class="inline-pre"><span class="noselect"><a href="#l1">`,
 		},
 	} {
-		res, err := http.Get(ts.URL + req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		resultBytes, err := ioutil.ReadAll(res.Body)
-		res.Body.Close()
-		if err != nil {
-			log.Fatal(err)
-		}
+		checkNeedles(t, ts, req, needles)
+	}
+}
 
-		result := string(resultBytes)
-		for _, want := range needles {
-			if !strings.Contains(result, want) {
-				t.Errorf("query %q: result did not have %q: %s", req, want, result)
-			}
+func TestPrintDefault(t *testing.T) {
+	b, err := zoekt.NewIndexBuilder(&zoekt.Repository{
+		Name:     "name",
+		URL:      "repo-url",
+		Branches: []zoekt.RepositoryBranch{{Name: "master", Version: "1234"}},
+	})
+	if err != nil {
+		t.Fatalf("NewIndexBuilder: %v", err)
+	}
+	if err := b.Add(zoekt.Document{
+		Name:     "f2",
+		Content:  []byte("to carry water in the no later bla"),
+		Branches: []string{"master"},
+	}); err != nil {
+		t.Fatalf("Add: %v", err)
+	}
+	s := searcherForTest(t, b)
+	srv := Server{
+		Searcher: s,
+		Top:      Top,
+		HTML:     true,
+	}
+
+	mux, err := NewMux(&srv)
+	if err != nil {
+		t.Fatalf("NewMux: %v", err)
+	}
+
+	ts := httptest.NewServer(mux)
+	defer ts.Close()
+
+	for req, needles := range map[string][]string{
+		"/search?q=water": []string{
+			`href="print?`,
+		},
+	} {
+		checkNeedles(t, ts, req, needles)
+	}
+}
+
+func checkNeedles(t *testing.T, ts *httptest.Server, req string, needles []string) {
+	res, err := http.Get(ts.URL + req)
+	if err != nil {
+		t.Fatal(err)
+	}
+	resultBytes, err := ioutil.ReadAll(res.Body)
+	res.Body.Close()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	result := string(resultBytes)
+	for _, want := range needles {
+		if !strings.Contains(result, want) {
+			t.Errorf("query %q: result did not have %q: %s", req, want, result)
 		}
-		if notWant := "crashed"; strings.Contains(result, notWant) {
-			t.Errorf("result has %q: %s", notWant, result)
-		}
-		if notWant := "bytes skipped)..."; strings.Contains(result, notWant) {
-			t.Errorf("result has %q: %s", notWant, result)
-		}
+	}
+	if notWant := "crashed"; strings.Contains(result, notWant) {
+		t.Errorf("result has %q: %s", notWant, result)
+	}
+	if notWant := "bytes skipped)..."; strings.Contains(result, notWant) {
+		t.Errorf("result has %q: %s", notWant, result)
 	}
 }
 
diff --git a/web/server.go b/web/server.go
index 7afb497..f0f7272 100644
--- a/web/server.go
+++ b/web/server.go
@@ -163,10 +163,9 @@
 		mux.HandleFunc("/search", s.serveSearch)
 		mux.HandleFunc("/", s.serveSearchBox)
 		mux.HandleFunc("/about", s.serveAbout)
-	}
-	if s.Print {
 		mux.HandleFunc("/print", s.servePrint)
 	}
+
 	return mux, nil
 }
 
@@ -195,7 +194,6 @@
 		return fmt.Errorf("no query found")
 	}
 
-	log.Printf("got query %q", queryStr)
 	q, err := query.Parse(queryStr)
 	if err != nil {
 		return err
@@ -480,10 +478,6 @@
 }
 
 func (s *Server) servePrintErr(w http.ResponseWriter, r *http.Request) error {
-	if !s.Print {
-		return fmt.Errorf("no printing template defined.")
-	}
-
 	qvals := r.URL.Query()
 	fileStr := qvals.Get("f")
 	repoStr := qvals.Get("r")
diff --git a/web/snippets.go b/web/snippets.go
index 9223c66..1b6112e 100644
--- a/web/snippets.go
+++ b/web/snippets.go
@@ -32,30 +32,35 @@
 	fragmentMap := map[string]*template.Template{}
 	if !localPrint {
 		for repo, str := range result.RepoURLs {
-			templateMap[repo] = s.getTemplate(str)
+			if str != "" {
+				templateMap[repo] = s.getTemplate(str)
+			}
 		}
 		for repo, str := range result.LineFragments {
-			fragmentMap[repo] = s.getTemplate(str)
+			if str != "" {
+				fragmentMap[repo] = s.getTemplate(str)
+			}
 		}
 	}
 	getFragment := func(repo string, linenum int) string {
-		if localPrint {
+		tpl := fragmentMap[repo]
+
+		if tpl == nil || localPrint {
 			return "#l" + strconv.Itoa(linenum)
 		}
-		if tpl := fragmentMap[repo]; tpl != nil {
-			var buf bytes.Buffer
-			if err := tpl.Execute(&buf, map[string]string{
-				"LineNumber": strconv.Itoa(linenum),
-			}); err != nil {
-				log.Printf("fragment template: %v", err)
-				return ""
-			}
-			return buf.String()
+
+		var buf bytes.Buffer
+		if err := tpl.Execute(&buf, map[string]string{
+			"LineNumber": strconv.Itoa(linenum),
+		}); err != nil {
+			log.Printf("fragment template: %v", err)
+			return ""
 		}
-		return ""
+		return buf.String()
 	}
 	getURL := func(repo, filename string, branches []string, version string) string {
-		if localPrint {
+		tpl := templateMap[repo]
+		if localPrint || tpl == nil {
 			v := make(url.Values)
 			v.Add("r", repo)
 			v.Add("f", filename)
@@ -66,24 +71,21 @@
 			return "print?" + v.Encode()
 		}
 
-		if tpl := templateMap[repo]; tpl != nil {
-			var buf bytes.Buffer
-			b := ""
-			if len(branches) > 0 {
-				b = branches[0]
-			}
-			err := tpl.Execute(&buf, map[string]string{
-				"Branch":  b,
-				"Version": version,
-				"Path":    filename,
-			})
-			if err != nil {
-				log.Printf("url template: %v", err)
-				return ""
-			}
-			return buf.String()
+		var buf bytes.Buffer
+		b := ""
+		if len(branches) > 0 {
+			b = branches[0]
 		}
-		return ""
+		err := tpl.Execute(&buf, map[string]string{
+			"Branch":  b,
+			"Version": version,
+			"Path":    filename,
+		})
+		if err != nil {
+			log.Printf("url template: %v", err)
+			return ""
+		}
+		return buf.String()
 	}
 
 	// hash => result-id