vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Search issues, changes and comments from one page
72f222921280b3c6c920ee81f6595b52563bb648 · Keenan Nemetz · 10d ago · parent 6762a520
Search issues, changes and comments from one page /search asks one question across the whole instance. The results are the rows from the search table, shown with the kind, the repository, the `#42` number when there is one, the author, and the matched sentence with the match marked. Two rules make the page honest: - Visibility is the page rule, not a second one. The handler asks the index for the repositories the request may read and passes only those ids to the query, so a private repository's titles cannot appear. - Freshness does not depend on a page having been visited. A search refreshes the repositories it is allowed to see before querying, so an issue pushed a minute ago is found even if nobody opened its repository since. An exact `#42` or id prefix is answered before the text search, so the entity someone named is the first row. The snippet is escaped before its match markers become tags. The header gains a Search item next to Activity; the repository search box on the home page is unchanged.
server/routes.go +1
| @@ -44,6 +44,7 @@ func (s *Server) globalRoutes(mux *http.ServeMux) { | |||
| 44 | 44 | w := s.Web | |
| 45 | 45 | mux.HandleFunc("GET /{$}", w.IndexPage) | |
| 46 | 46 | mux.HandleFunc("GET /activity", w.InstanceActivity) | |
| 47 | mux.HandleFunc("GET /search", w.Search) | ||
| 47 | 48 | mux.HandleFunc("GET /status", w.StatusPage) | |
| 48 | 49 | mux.HandleFunc("GET /healthz", func(rw http.ResponseWriter, r *http.Request) { | |
| 49 | 50 | rw.Header().Set("Content-Type", "text/plain") | |