summaryrefslogtreecommitdiff
path: root/Magefile.go
blob: d22ca4338df24fa2e24abb251fe70d65e4f24436 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//go:build mage
// +build mage

package main

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/magefile/mage/mg"
	"github.com/magefile/mage/sh"
)

const (
	binaryName = "gitsyncer"
	buildDir   = "."
	cmdPath    = "./cmd/gitsyncer"
	ldflags    = "-s -w"
)

// Default target to run when none is specified
var Default = Build

// Build builds the gitsyncer binary
func Build() error {
	fmt.Println("Building gitsyncer...")
	return sh.RunWith(nil, "go", "build", "-ldflags", ldflags, "-o", filepath.Join(buildDir, binaryName), cmdPath)
}

// BuildAll builds for all supported platforms
func BuildAll() error {
	mg.Deps(BuildLinux, BuildDarwin, BuildWindows)
	return nil
}

// BuildLinux builds for Linux
func BuildLinux() error {
	fmt.Println("Building for Linux...")
	env := map[string]string{
		"GOOS":   "linux",
		"GOARCH": "amd64",
	}
	return sh.RunWith(env, "go", "build", "-ldflags", ldflags, "-o", filepath.Join(buildDir, binaryName+"-linux-amd64"), cmdPath)
}

// BuildDarwin builds for macOS
func BuildDarwin() error {
	fmt.Println("Building for macOS...")
	env := map[string]string{
		"GOOS":   "darwin",
		"GOARCH": "amd64",
	}
	if err := sh.RunWith(env, "go", "build", "-ldflags", ldflags, "-o", filepath.Join(buildDir, binaryName+"-darwin-amd64"), cmdPath); err != nil {
		return err
	}

	env["GOARCH"] = "arm64"
	return sh.RunWith(env, "go", "build", "-ldflags", ldflags, "-o", filepath.Join(buildDir, binaryName+"-darwin-arm64"), cmdPath)
}

// BuildWindows builds for Windows
func BuildWindows() error {
	fmt.Println("Building for Windows...")
	env := map[string]string{
		"GOOS":   "windows",
		"GOARCH": "amd64",
	}
	return sh.RunWith(env, "go", "build", "-ldflags", ldflags, "-o", filepath.Join(buildDir, binaryName+"-windows-amd64.exe"), cmdPath)
}

// Run builds and runs the gitsyncer binary
func Run() error {
	mg.Deps(Build)
	return sh.Run(filepath.Join(".", binaryName))
}

// Test runs tests
func Test() error {
	fmt.Println("Running tests...")
	return sh.Run("go", "test", "./...")
}

// TestVerbose runs tests with verbose output
func TestVerbose() error {
	fmt.Println("Running tests (verbose)...")
	return sh.Run("go", "test", "-v", "./...")
}

// Clean removes build artifacts
func Clean() error {
	fmt.Println("Cleaning build artifacts...")
	files, err := filepath.Glob(binaryName + "*")
	if err != nil {
		return err
	}
	for _, f := range files {
		if err := os.Remove(f); err != nil && !os.IsNotExist(err) {
			fmt.Printf("Warning: failed to remove %s: %v\n", f, err)
		}
	}
	return nil
}

// ModTidy tidies go modules
func ModTidy() error {
	fmt.Println("Tidying go modules...")
	return sh.Run("go", "mod", "tidy")
}

// Fmt formats Go code
func Fmt() error {
	fmt.Println("Formatting Go code...")
	return sh.Run("go", "fmt", "./...")
}

// Vet runs go vet
func Vet() error {
	fmt.Println("Running go vet...")
	return sh.Run("go", "vet", "./...")
}

// Lint runs golangci-lint
func Lint() error {
	fmt.Println("Running golangci-lint...")
	return sh.Run("golangci-lint", "run")
}

// Install installs gitsyncer to $GOPATH/bin
func Install() error {
	fmt.Println("Installing gitsyncer...")
	return sh.Run("go", "install", cmdPath)
}

// Version shows version
func Version() error {
	mg.Deps(Build)
	return sh.Run(filepath.Join(".", binaryName), "version")
}