summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-25 11:34:59 +0300
committerPaul Buetow <paul@buetow.org>2026-06-25 11:34:59 +0300
commit9c96b88d6f1f9c92b4bca20fac59a9be56f511a2 (patch)
tree422f7270e334d69f16c5d07e587137c8a173e20c
parent8c463a644d8023d4b6f51f712932777e98600c76 (diff)
Refactor Magefile conventions for task 1r0
-rw-r--r--Magefile.go90
1 files changed, 70 insertions, 20 deletions
diff --git a/Magefile.go b/Magefile.go
index 1f4f1cc..9a1430b 100644
--- a/Magefile.go
+++ b/Magefile.go
@@ -1,38 +1,53 @@
//go:build mage
// +build mage
+// Mage targets for TaskSamurai.
package main
import (
"fmt"
"os"
+ "path/filepath"
"strings"
+ "github.com/magefile/mage/mg"
"github.com/magefile/mage/sh"
)
-// Default target builds the tasksamurai binary
-func Default() error {
- return Build()
+const binaryName = "tasksamurai"
+
+// Default builds the tasksamurai binary.
+func Default() {
+ mg.Deps(Build)
}
-// Build compiles the tasksamurai binary
+// Build compiles the tasksamurai binary.
func Build() error {
fmt.Println("Building tasksamurai...")
- return sh.Run("go", "build", "-o", "tasksamurai", "./cmd/tasksamurai")
+ if err := sh.RunV("go", "build", "-o", binaryName, "./cmd/tasksamurai"); err != nil {
+ return fmt.Errorf("build %s: %w", binaryName, err)
+ }
+ return nil
}
-// Run starts tasksamurai with any provided arguments
+// Run builds and starts tasksamurai with any provided arguments.
func Run() error {
+ mg.Deps(Build)
+
fmt.Println("Running tasksamurai...")
- args := append([]string{"run", "./cmd/tasksamurai"}, os.Args[1:]...)
- return sh.Run("go", args...)
+ if err := sh.RunV("./"+binaryName, targetArgs("run")...); err != nil {
+ return fmt.Errorf("run %s: %w", binaryName, err)
+ }
+ return nil
}
-// Test runs all tests
+// Test runs all tests.
func Test() error {
fmt.Println("Running tests...")
- return sh.Run("go", "test", "./...")
+ if err := sh.RunV("go", "test", "./..."); err != nil {
+ return fmt.Errorf("test: %w", err)
+ }
+ return nil
}
// Verify runs formatting and static checks before tests.
@@ -40,34 +55,69 @@ func Verify() error {
fmt.Println("Checking gofmt...")
out, err := sh.Output("gofmt", "-l", ".")
if err != nil {
- return err
+ return fmt.Errorf("check gofmt: %w", err)
}
if strings.TrimSpace(out) != "" {
return fmt.Errorf("gofmt needed for:\n%s", out)
}
fmt.Println("Running errcheck...")
- if err := sh.Run("errcheck", "./..."); err != nil {
- return err
+ if err := sh.RunV("errcheck", "./..."); err != nil {
+ return fmt.Errorf("errcheck: %w", err)
}
- return Test()
+ mg.Deps(Test)
+ return nil
}
-// Install installs tasksamurai to $GOPATH/bin
+// Install builds and installs tasksamurai to $GOPATH/bin.
func Install() error {
+ mg.Deps(Build)
+
fmt.Println("Installing tasksamurai...")
- return sh.Run("go", "install", "./cmd/tasksamurai")
+ goPath := os.Getenv("GOPATH")
+ if goPath == "" {
+ home, err := os.UserHomeDir()
+ if err != nil {
+ return fmt.Errorf("resolve home directory: %w", err)
+ }
+ goPath = filepath.Join(home, "go")
+ }
+
+ binDir := filepath.Join(goPath, "bin")
+ if err := os.MkdirAll(binDir, 0o755); err != nil {
+ return fmt.Errorf("create install directory %s: %w", binDir, err)
+ }
+
+ installPath := filepath.Join(binDir, binaryName)
+ if err := sh.RunV("cp", "-v", binaryName, installPath); err != nil {
+ return fmt.Errorf("install %s to %s: %w", binaryName, installPath, err)
+ }
+ return nil
}
-// Clean removes the built binary
+// Clean removes the built binary.
func Clean() error {
fmt.Println("Cleaning...")
- if err := sh.Rm("tasksamurai"); err != nil {
- // Ignore error if file doesn't exist
+ if err := sh.Rm(binaryName); err != nil {
if !os.IsNotExist(err) {
- return err
+ return fmt.Errorf("remove %s: %w", binaryName, err)
+ }
+ }
+ return nil
+}
+
+func targetArgs(target string) []string {
+ for i, arg := range os.Args[1:] {
+ if !strings.EqualFold(arg, target) {
+ continue
+ }
+
+ args := os.Args[i+2:]
+ if len(args) > 0 && args[0] == "--" {
+ return args[1:]
}
+ return args
}
return nil
}