Skip to content

Commit 384a6ac

Browse files
natefinchbep
authored andcommitted
Create magefile from Makefile
This commit makes a magefile.go that should be functionally equivalent to the current Makefile.
1 parent 4fc67fe commit 384a6ac

File tree

1 file changed

+230
-0
lines changed

1 file changed

+230
-0
lines changed

‎magefile.go‎

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
// +build mage
2+
3+
package main
4+
5+
import (
6+
"bytes"
7+
"errors"
8+
"io/ioutil"
9+
"os"
10+
"path/filepath"
11+
"strings"
12+
"time"
13+
14+
"github.com/magefile/mage/mg"
15+
"github.com/magefile/mage/sh"
16+
)
17+
18+
const (
19+
packageName = "github.com/gohugoio/hugo"
20+
noGitLdflags = "-X $PACKAGE/hugolib.BuildDate=$BUILD_DATE"
21+
)
22+
23+
var ldflags = "-X $PACKAGE/hugolib.CommitHash=$COMMIT_HASH -X $PACKAGE/hugolib.BuildDate=$BUILD_DATE"
24+
25+
// allow user to override go executable by running as GOEXE=xxx make ... on unix-like systems
26+
var goexe = "go"
27+
28+
func init() {
29+
if exe := os.Getenv("GOEXE"); exe != "" {
30+
goexe = exe
31+
}
32+
}
33+
34+
func govendor() error {
35+
return sh.Run(goexe, "get", "github.com/kardianos/govendor")
36+
}
37+
38+
// Install govendor and sync Hugo's vendored dependencies
39+
func Vendor() error {
40+
mg.Deps(govendor)
41+
return sh.Run("govendor", "sync", packageName)
42+
}
43+
44+
// Build hugo binary
45+
func Hugo() error {
46+
mg.Deps(Vendor)
47+
return sh.RunWith(flagEnv(), goexe, "build", "-ldflags", ldflags, packageName)
48+
}
49+
50+
// Build hugo binary with race detector enabled
51+
func HugoRace() error {
52+
mg.Deps(Vendor)
53+
return sh.RunWith(flagEnv(), goexe, "build", "-race", "-ldflags", ldflags, packageName)
54+
}
55+
56+
// Install hugo binary
57+
func Install() error {
58+
mg.Deps(Vendor)
59+
return sh.RunWith(flagEnv(), goexe, "install", "-ldflags", ldflags, packageName)
60+
}
61+
62+
func flagEnv() map[string]string {
63+
hash, _ := sh.Output("git", "rev-parse", "--short", "HEAD")
64+
return map[string]string{
65+
"PACKAGE": packageName,
66+
"COMMIT_HASH": hash,
67+
"BUILD_DATE": time.Now().Format("2006-01-02T15:04:05Z0700"),
68+
}
69+
}
70+
71+
// Build hugo without git info
72+
func HugoNoGitInfo() {
73+
ldflags = noGitLdflags
74+
mg.Deps(Vendor, Hugo)
75+
}
76+
77+
var docker = sh.RunCmd("docker")
78+
79+
// Build hugo Docker container
80+
func Docker() error {
81+
if err := docker("build", "-t", "hugo", "."); err != nil {
82+
return err
83+
}
84+
// yes ignore errors here
85+
docker("rm", "-f", "hugo-build")
86+
if err := docker("run", "--name", "hugo-build", "hugo ls /go/bin"); err != nil {
87+
return err
88+
}
89+
if err := docker("cp", "hugo-build:/go/bin/hugo", "."); err != nil {
90+
return err
91+
}
92+
return docker("rm", "hugo-build")
93+
}
94+
95+
// Run tests and linters
96+
func Check() {
97+
mg.Deps(TestRace, Test386, Fmt, Vet)
98+
}
99+
100+
// Run tests in 32-bit mode
101+
func Test386() error {
102+
return sh.RunWith(map[string]string{"GOARCH": "386"}, "govendor", "test", "+local")
103+
}
104+
105+
// Run tests
106+
func Test() error {
107+
mg.Deps(govendor)
108+
return sh.Run("govendor", "test", "+local")
109+
}
110+
111+
// Run tests with race detector
112+
func TestRace() error {
113+
mg.Deps(govendor)
114+
return sh.Run("govendor", "test", "-race", "+local")
115+
}
116+
117+
// Run gofmt linter
118+
func Fmt() error {
119+
pkgs, err := hugoPackages()
120+
if err != nil {
121+
return err
122+
}
123+
failed := false
124+
for _, pkg := range pkgs {
125+
files, err := filepath.Glob(filepath.Join(pkg, "*.go"))
126+
if err != nil {
127+
return nil
128+
}
129+
for _, f := range files {
130+
if err := sh.Run("gofmt", "-l", f); err != nil {
131+
failed = false
132+
}
133+
}
134+
}
135+
if failed {
136+
return errors.New("improperly formatted go files")
137+
}
138+
return nil
139+
}
140+
141+
var pkgPrefixLen = len("github.com/gohugoio/hugo")
142+
143+
func hugoPackages() ([]string, error) {
144+
mg.Deps(govendor)
145+
s, err := sh.Output("govendor", "list", "-no-status", "+local")
146+
if err != nil {
147+
return nil, err
148+
}
149+
pkgs := strings.Split(s, "\n")
150+
for i := range pkgs {
151+
pkgs[i] = "." + pkgs[i][pkgPrefixLen:]
152+
}
153+
return pkgs, nil
154+
}
155+
156+
// Run golint linter
157+
func Lint() error {
158+
pkgs, err := hugoPackages()
159+
if err != nil {
160+
return err
161+
}
162+
failed := false
163+
for _, pkg := range pkgs {
164+
if _, err := sh.Exec(nil, os.Stderr, os.Stderr, "golint", "-set_exit_status", pkg); err != nil {
165+
failed = true
166+
}
167+
}
168+
if failed {
169+
return errors.New("golint errors!")
170+
}
171+
return nil
172+
}
173+
174+
// Run go vet linter
175+
func Vet() error {
176+
mg.Deps(govendor)
177+
if err := sh.Run("govendor", "vet", "+local"); err != nil {
178+
return errors.New("go vet errors!")
179+
}
180+
return nil
181+
}
182+
183+
// Generate test coverage report
184+
func TestCoverHTML() error {
185+
mg.Deps(govendor)
186+
const (
187+
coverAll = "coverage-all.out"
188+
cover = "coverage.out"
189+
)
190+
f, err := os.Create(coverAll)
191+
if err != nil {
192+
return err
193+
}
194+
defer f.Close()
195+
if _, err := f.Write([]byte("mode: count")); err != nil {
196+
return err
197+
}
198+
pkgs, err := hugoPackages()
199+
if err != nil {
200+
return err
201+
}
202+
for _, pkg := range pkgs {
203+
if err := sh.Run("govendor", "test", "-coverprofile="+cover, "-covermode=count", pkg); err != nil {
204+
return err
205+
}
206+
b, err := ioutil.ReadFile(cover)
207+
if err != nil {
208+
return err
209+
}
210+
idx := bytes.Index(b, []byte{'\n'})
211+
b = b[idx+1:]
212+
if _, err := f.Write(b); err != nil {
213+
return err
214+
}
215+
}
216+
if err := f.Close(); err != nil {
217+
return err
218+
}
219+
return sh.Run(goexe, "tool", "cover", "-html="+coverAll)
220+
}
221+
222+
// Verify that vendored packages match git HEAD
223+
func CheckVendor() error {
224+
if err := sh.Run("git", "diff-index", "--quiet", "HEAD", "vendor/"); err != nil {
225+
// yes, ignore errors from this, not much we can do.
226+
sh.Exec(nil, os.Stdout, os.Stderr, "git", "diff", "vendor/")
227+
return errors.New("check-vendor target failed: vendored packages out of sync")
228+
}
229+
return nil
230+
}

0 commit comments

Comments
 (0)