blob: 64216bed8e78a0bdf23962266db25876e8f1b7d5 [file] [log] [blame] [edit]
//go:build ignore
// +build ignore
package main
/*
Generate asset_versions_gen.go.
*/
import (
"context"
"fmt"
"io"
"os"
"path"
"path/filepath"
"runtime"
"sort"
"strings"
"go.skia.org/infra/go/bazel"
"go.skia.org/infra/go/cipd"
"go.skia.org/infra/go/exec"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/go/util"
)
const (
TARGET_FILE = "asset_versions_gen.go"
HEADER = `// Code generated by "go run gen_versions.go"; DO NOT EDIT
package cipd
var PACKAGES = map[string]*Package{
`
FOOTER = `}`
)
func genAssetVersionsGo(depsEntries map[bazel.DependencyID]bazel.Dependency, pkgDir, rootDir string) error {
// Pull out only the CIPD dependencies.
var pkgs []*cipd.Package
for _, entry := range depsEntries {
if !strings.HasPrefix(entry.GetFunction(), "cipd") {
continue
}
pkg := &cipd.Package{
Path: ".", // TODO(borenet): How to fill this in?
Name: string(entry.GetID()),
Version: entry.GetVersion(),
}
pkgs = append(pkgs, pkg)
}
// List the assets.
assetsDir := path.Join(rootDir, "infra", "bots", "assets")
entries, err := os.ReadDir(assetsDir)
if err != nil {
return skerr.Wrap(err)
}
for _, e := range entries {
if e.IsDir() {
contents, err := os.ReadFile(path.Join(assetsDir, e.Name(), "VERSION"))
if err == nil {
name := e.Name()
fullName := fmt.Sprintf("skia/bots/%s", name)
pkgs = append(pkgs, &cipd.Package{
Path: name,
Name: fullName,
Version: cipd.VersionTag(strings.TrimSpace(string(contents))),
})
} else if !os.IsNotExist(err) {
return skerr.Wrap(err)
}
}
}
// Write the file.
sort.Sort(cipd.PackageSlice(pkgs))
targetFile := path.Join(pkgDir, TARGET_FILE)
if err := util.WithWriteFile(targetFile, func(w io.Writer) error {
_, err := w.Write([]byte(HEADER))
if err != nil {
return err
}
for _, pkg := range pkgs {
_, err := fmt.Fprintf(w, ` "%s": &Package{
Path: "%s",
Name: "%s",
Version: "%s",
},
`, pkg.Name, pkg.Path, pkg.Name, pkg.Version)
if err != nil {
return err
}
}
_, err = w.Write([]byte(FOOTER))
return err
}); err != nil {
return skerr.Wrap(err)
}
if _, err := exec.RunCwd(context.Background(), ".", "gofmt", "-s", "-w", targetFile); err != nil {
return skerr.Wrap(err)
}
return nil
}
func main() {
// Read and parse the MODULE.bazel file.
_, filename, _, _ := runtime.Caller(0)
pkgDir := path.Dir(filename)
rootDir := path.Join(pkgDir, "..", "..")
contents, err := os.ReadFile(filepath.Join(rootDir, "MODULE.bazel"))
if err != nil {
sklog.Fatal(err)
}
entries, err := bazel.ParseDeps(string(contents))
if err != nil {
sklog.Fatal(err)
}
if err := genAssetVersionsGo(entries, pkgDir, rootDir); err != nil {
sklog.Fatal(err)
}
}