//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 ( prjsfilename = flag.String("prjs", "", "projects 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 projects. prjs, err := thirdparty.LoadProjectsFile(*prjsfilename) if err != nil { return err } if err := prjs.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(prjs) if err != nil { return err } // Write output. if _, err := w.Write(b); err != nil { return err } return nil } func GenerateWorkflow(prjs thirdparty.Projects) ([]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 test case. g.Linef("jobs:") g.Indent() for _, t := range prjs.Tests() { g.Linef("%s:", t.ID()) g.Indent() g.Linef("runs-on: ubuntu-latest") if t.Project.Skip() { g.Linef("if: false # skip: %s", t.Project.Reason()) } g.Linef("steps:") g.Indent() // Install Go. g.Linef("- name: Install Go") g.Linef(" uses: actions/setup-go@f6164bd8c8acb4a71fb2791a8b6c4024ff038dab # v3.0.0") g.Linef(" with:") g.Linef(" go-version: 1.18.x") g.Linef(" check-latest: true") // 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 := t.Project.Repository.Name g.Linef("- name: Checkout %s", t.Project.Repository) g.Linef(" uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4") g.Linef(" with:") g.Linef(" repository: %s", t.Project.Repository) g.Linef(" ref: %s", t.Project.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 t.Package.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() }