vikunja/veans/magefile.go

112 lines
2.9 KiB
Go

//go:build mage
// Mage targets for the veans CLI. Patterned after the parent monorepo's
// magefile (Build/Test/Lint namespaces), but scoped to this submodule.
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"github.com/magefile/mage/mg"
"github.com/magefile/mage/sh"
)
// Build compiles the veans binary into ./veans (or ./veans.exe on Windows).
func Build() error {
out := "./veans"
if runtime.GOOS == "windows" {
out = "./veans.exe"
}
return sh.RunV("go", "build", "-o", out, "./cmd/veans")
}
// Clean removes built artifacts.
func Clean() error {
for _, p := range []string{"./veans", "./veans.exe"} {
if _, err := os.Stat(p); err == nil {
if err := os.Remove(p); err != nil {
return err
}
}
}
return nil
}
// Fmt runs goimports across the module.
func Fmt() error {
return sh.RunV("go", "fmt", "./...")
}
// Test namespace.
type Test mg.Namespace
// All runs unit tests across the module.
func (Test) All() error {
return sh.RunV("go", "test", "./...")
}
// Filter runs `go test -run <expr> ./...` — pass the expression as an argument.
func (Test) Filter(expr string) error {
if expr == "" {
return fmt.Errorf("test:filter requires a regexp argument")
}
return sh.RunV("go", "test", "-run", expr, "./...")
}
// E2E runs the e2e suite. Requires VEANS_E2E_API_URL to point at a running
// Vikunja instance and either VEANS_E2E_ADMIN_TOKEN or
// VEANS_E2E_ADMIN_USER + VEANS_E2E_ADMIN_PASS for the admin/seed identity.
//
// Set VEANS_E2E_SKIP_BUILD=true to reuse a previously-built binary.
func (Test) E2E() error {
if os.Getenv("VEANS_E2E_API_URL") == "" {
return fmt.Errorf("VEANS_E2E_API_URL is not set — start a Vikunja instance and export the URL")
}
if os.Getenv("VEANS_E2E_ADMIN_TOKEN") == "" {
if os.Getenv("VEANS_E2E_ADMIN_USER") == "" || os.Getenv("VEANS_E2E_ADMIN_PASS") == "" {
return fmt.Errorf("set either VEANS_E2E_ADMIN_TOKEN or VEANS_E2E_ADMIN_USER + VEANS_E2E_ADMIN_PASS")
}
}
if os.Getenv("VEANS_E2E_SKIP_BUILD") == "" {
if err := Build(); err != nil {
return err
}
}
abs, err := filepath.Abs("./veans")
if err != nil {
return err
}
return sh.RunWithV(map[string]string{"VEANS_BINARY": abs}, "go", "test", "-count=1", "./e2e/...")
}
// Lint namespace.
type Lint mg.Namespace
// All runs golangci-lint over the module.
func (Lint) All() error {
if _, err := exec.LookPath("golangci-lint"); err != nil {
return fmt.Errorf("golangci-lint not installed: %w", err)
}
return sh.RunV("golangci-lint", "run", "./...")
}
// Fix runs golangci-lint with --fix.
func (Lint) Fix() error {
if _, err := exec.LookPath("golangci-lint"); err != nil {
return fmt.Errorf("golangci-lint not installed: %w", err)
}
return sh.RunV("golangci-lint", "run", "--fix", "./...")
}
// trimLast is a tiny helper for prettier path printing in error messages.
func trimLast(p string) string {
return strings.TrimSuffix(p, "/")
}
var _ = trimLast