This change adds support for displaying issues/changes not just for a single package at a time, but an arbitrary amount of packages that match the specified import path pattern. Reserved names "all", "std", and "cmd" are supported, and expand as expected.
This makes the page rendering code in serveIssues and serveChanges methods more consistently high-level, and as a result, more readable. It will make it easier to add new similar issues/changes pages that display entries for import path patterns.
This change makes minor frontend tweaks to improve accessibility. Also use margin-left instead of padding-left, to avoid making the "Packages" link area become larger on the left side. Using margin-left instead keeps the space on left unchanged, without expanding the link. Regenerate with: go generate ./...
It should be beneficial to reduce bandwidth and speed up page load time. Many dynamic pages will compress well (e.g., from 521 KB to 27.2 KB). This is in large part because inline SVG are often repeated many times. Only do so if the handler hasn't already taken care of compression. This is determined by whether the Content-Encoding header is set by the time WriteHeader is called.
This is a more consistent naming scheme. The detail comes first, the interface name comes last. Similar to limitedWriter, nopCloser, etc.
It's sometimes desirable to see all CLs/PRs for a specific Go package. This change makes that possible via the https://gochanges.org domain.
Previously, the import path was used directly as an issue title prefix. This works for most import paths, but not for golang.org/x/... ones. We need to map those to x/... prefixes. Also simplify code in ParsePrefixedTitle.
Sometimes it's helpful to be able to see a list of all packages (and their number of open issues) at a glance. Since they're all on one page, it's easy to use the browser's search functionality to find a specific package or parent folder. If Accept header is set to exactly "application/json", respond in JSON format.
Some Go packages are not available for all OSes. Doing a normal "go list" only lists packages that match the current GOOS/GOARCH pair (darwin/amd64 in my case). So we run it with different GOOS values to include all packages.