blob: a53bc811138428ad2f22f4f59f660155a3dbf4f4 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package repos contains information about Go source repositories.
package repos
import "fmt"
type Repo struct {
// GoGerritProject, if non-empty, is the repo's Gerrit project
// name, such as "go", "net", or "sys".
GoGerritProject string
// ImportPath is the repo's import path.
// It is empty for the main Go repo and other repos that do not
// contain Go code.
ImportPath string
// MirrorToGitHub controls whether this repo is mirrored
// from Gerrit to GitHub. If true, GoGerritProject and
// gitHubRepo must both be defined.
MirrorToGitHub bool
// MirrorToCSR controls whether this repo is mirrored from
// Gerrit to Cloud Source Repositories. If true, GoGerritProject
// must be defined. It will be mirrored to a CSR repo with the
// same name as the Gerrit repo.
MirrorToCSR bool
// showOnDashboard is whether to show the repo on the bottom
// of build.golang.org in the repo overview section.
showOnDashboard bool
// CoordinatorCanBuild reports whether this a repo that the
// build coordinator knows how to build.
CoordinatorCanBuild bool
// GitHubRepo is the "org/repo" of where this repo exists on
// GitHub. If MirrorToGitHub is true, this is the
// destination.
GitHubRepo string
// WebsiteDesc is the description of the repo for showing on
// https://golang.org/pkg/#subrepo.
// It should be plain text. Hostnames may be auto-linkified.
WebsiteDesc string
}
// ByGerritProject maps from a Gerrit project name ("go", "net", etc)
// to the Repo's information.
var ByGerritProject = map[string]*Repo{ /* initialized below */ }
// ByImportPath maps from an import path ("golang.org/x/net") to the
// Repo's information.
var ByImportPath = map[string]*Repo{ /* initialized below */ }
func init() {
addMirrored("go", coordinatorCanBuild, noDash, enableCSR)
addMirrored("dl", importPath("golang.org/dl"), coordinatorCanBuild)
addMirrored("gddo", importPath("github.com/golang/gddo"), archivedOnGitHub)
addMirrored("gofrontend")
addMirrored("proposal")
addMirrored("sublime-build")
addMirrored("sublime-config")
x("arch")
x("benchmarks", desc("benchmarks to measure Go as it is developed"))
x("blog", noDash)
x("build", desc("build.golang.org's implementation"))
x("crypto", desc("additional cryptography packages"))
x("debug", desc("an experimental debugger for Go"))
x("example", noDash)
x("exp", desc("experimental and deprecated packages (handle with care; may change without warning)"))
x("image", desc("additional imaging packages"))
x("lint", noDash, archivedOnGitHub)
x("mobile", desc("experimental support for Go on mobile platforms"))
x("mod")
x("net", desc("additional networking packages"))
x("oauth2")
x("perf", desc("packages and tools for performance measurement, storage, and analysis"))
x("pkgsite", desc("home of the pkg.go.dev website"), noBuildAndNoDash)
x("playground", noDash, enableCSR)
x("review", desc("a tool for working with Gerrit code reviews"))
x("scratch", noDash)
x("sync", desc("additional concurrency primitives"))
x("sys", desc("packages for making system calls"))
x("talks")
x("term")
x("text", desc("packages for working with text"))
x("time", desc("additional time packages"))
x("tools", desc("godoc, goimports, gorename, and other tools"))
x("tour", noDash)
x("vgo", noDash)
x("vulndb", desc("the Go Vulnerability Database and packages for working with it"), enableCSR)
x("website", desc("home of the golang.org and go.dev websites"), enableCSR)
x("xerrors", noDash)
add(&Repo{GoGerritProject: "gollvm"})
add(&Repo{GoGerritProject: "grpc-review"})
add(&Repo{
GoGerritProject: "protobuf",
MirrorToGitHub: true,
ImportPath: "google.golang.org/protobuf",
GitHubRepo: "protocolbuffers/protobuf-go",
})
add(&Repo{
GoGerritProject: "vscode-go",
MirrorToGitHub: true,
GitHubRepo: "golang/vscode-go",
})
}
type modifyRepo func(*Repo)
// noDash is an option to the x func that marks the repo as hidden on
// the https://build.golang.org/ dashboard.
func noDash(r *Repo) { r.showOnDashboard = false }
func noBuildAndNoDash(r *Repo) { r.CoordinatorCanBuild, r.showOnDashboard = false, false }
func coordinatorCanBuild(r *Repo) { r.CoordinatorCanBuild = true }
func archivedOnGitHub(r *Repo) {
// When a repository is archived on GitHub, trying to push
// to it will fail. So don't mirror.
r.MirrorToGitHub = false
}
func enableCSR(r *Repo) {
r.MirrorToCSR = true
}
func importPath(v string) modifyRepo { return func(r *Repo) { r.ImportPath = v } }
func desc(v string) modifyRepo { return func(r *Repo) { r.WebsiteDesc = v } }
// addMirrored adds a repo that's on Gerrit and mirrored to GitHub.
func addMirrored(proj string, opts ...modifyRepo) {
repo := &Repo{
GoGerritProject: proj,
MirrorToGitHub: true,
GitHubRepo: "golang/" + proj,
}
for _, o := range opts {
o(repo)
}
add(repo)
}
// x adds a golang.org/x repo.
func x(proj string, opts ...modifyRepo) {
repo := &Repo{
GoGerritProject: proj,
MirrorToGitHub: true,
CoordinatorCanBuild: true,
ImportPath: "golang.org/x/" + proj,
GitHubRepo: "golang/" + proj,
showOnDashboard: true,
}
for _, o := range opts {
o(repo)
}
add(repo)
}
func add(r *Repo) {
if (r.MirrorToCSR || r.MirrorToGitHub || r.showOnDashboard) && r.GoGerritProject == "" {
panic(fmt.Sprintf("project %+v sets feature(s) that require a GoGerritProject, but has none", r))
}
if r.MirrorToGitHub && r.GitHubRepo == "" {
panic(fmt.Sprintf("project %+v has MirrorToGitHub but no gitHubRepo", r))
}
if r.showOnDashboard && !r.CoordinatorCanBuild {
panic(fmt.Sprintf("project %+v is showOnDashboard but not marked buildable by coordinator", r))
}
if p := r.GoGerritProject; p != "" {
if _, dup := ByGerritProject[p]; dup {
panic(fmt.Sprintf("duplicate Gerrit project %q in %+v", p, r))
}
ByGerritProject[p] = r
}
if p := r.ImportPath; p != "" {
if _, dup := ByImportPath[p]; dup {
panic(fmt.Sprintf("duplicate import path %q in %+v", p, r))
}
ByImportPath[p] = r
}
}
// ShowOnDashboard reports whether this repo should show up on build.golang.org
// in the list of repos at bottom.
//
// When this returns true, r.GoGerritProject is guaranteed to be non-empty.
func (r *Repo) ShowOnDashboard() bool { return r.showOnDashboard }