Files
avo/tests/thirdparty/make_workflow.go
2022-04-10 21:03:05 -07:00

152 lines
3.1 KiB
Go

//go:build ignore
// +build ignore
package main
import (
"flag"
"log"
"os"
"path"
"path/filepath"
"runtime"
"github.com/mmcloughlin/avo/internal/prnt"
"github.com/mmcloughlin/avo/tests/thirdparty"
)
var (
pkgsfilename = flag.String("pkgs", "", "packages configuration")
output = flag.String("output", "", "path to output file (default stdout)")
)
func main() {
if err := mainerr(); err != nil {
log.Fatal(err)
}
}
func mainerr() error {
flag.Parse()
// Read packages.
pkgs, err := thirdparty.LoadPackagesFile(*pkgsfilename)
if err != nil {
return err
}
if err := pkgs.Validate(); err != nil {
return err
}
// Determine output.
w := os.Stdout
if *output != "" {
f, err := os.Create(*output)
if err != nil {
return err
}
defer f.Close()
w = f
}
// Generate workflow file.
b, err := GenerateWorkflow(pkgs)
if err != nil {
return err
}
// Write output.
if _, err := w.Write(b); err != nil {
return err
}
return nil
}
func GenerateWorkflow(pkgs thirdparty.Packages) ([]byte, error) {
g := &prnt.Generator{}
g.SetIndentString(" ")
_, self, _, _ := runtime.Caller(0)
g.Linef("# Code generated by %s. DO NOT EDIT.", filepath.Base(self))
g.NL()
// Header.
g.Linef("name: packages")
g.Linef("permissions:")
g.Linef(" contents: read")
g.Linef("on:")
g.Linef(" push:")
g.Linef(" branches:")
g.Linef(" - master")
g.Linef(" pull_request:")
// One job per package.
g.NL()
g.Linef("jobs:")
g.Indent()
for _, pkg := range pkgs {
g.Linef("%s:", pkg.ID())
g.Indent()
g.Linef("runs-on: ubuntu-latest")
if pkg.Skip() {
g.Linef("if: false # skip: %s", pkg.Reason())
}
g.Linef("steps:")
g.Indent()
// Install Go.
g.Linef("- name: Install Go")
g.Linef(" uses: actions/setup-go@37335c7bb261b353407cff977110895fa0b4f7d8 # v2.1.3")
g.Linef(" with:")
g.Linef(" go-version: 1.18.x")
// Checkout avo.
avodir := "avo"
g.Linef("- name: Checkout avo")
g.Linef(" uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4")
g.Linef(" with:")
g.Linef(" path: %s", avodir)
g.Linef(" persist-credentials: false")
// Checkout the third-party package.
pkgdir := pkg.Repository.Name
g.Linef("- name: Checkout %s", pkg.Repository)
g.Linef(" uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4")
g.Linef(" with:")
g.Linef(" repository: %s", pkg.Repository)
g.Linef(" ref: %s", pkg.Version)
g.Linef(" path: %s", pkgdir)
g.Linef(" persist-credentials: false")
// Build steps.
c := &thirdparty.Context{
AvoDirectory: path.Join("${{ github.workspace }}", avodir),
RepositoryDirectory: path.Join("${{ github.workspace }}", pkgdir),
}
for _, step := range pkg.Steps(c) {
g.Linef("- name: %s", step.Name)
g.Linef(" working-directory: %s", path.Join(pkgdir, step.WorkingDirectory))
if len(step.Commands) == 1 {
g.Linef(" run: %s", step.Commands[0])
} else {
g.Linef(" run: |")
for _, cmd := range step.Commands {
g.Linef(" %s", cmd)
}
}
}
g.Dedent()
g.Dedent()
}
g.Dedent()
return g.Result()
}