diff options
author | Nate Finch <[email protected]> | 2017-10-02 22:29:31 -0400 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2017-10-03 23:23:10 +0200 |
commit | 384a6ac4bd2de16fcd6a1c952e7ca41b66023a12 (patch) | |
tree | 7f986b87c35a625d08d8edd0453a5033dc829aac | |
parent | 4fc67fe44a3c65fc7faaed21d5fa5bb5f87edf2c (diff) | |
download | hugo-384a6ac4bd2de16fcd6a1c952e7ca41b66023a12.tar.gz hugo-384a6ac4bd2de16fcd6a1c952e7ca41b66023a12.zip |
Create magefile from Makefile
This commit makes a magefile.go that should be functionally equivalent to
the current Makefile.
-rw-r--r-- | magefile.go | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/magefile.go b/magefile.go new file mode 100644 index 000000000..39ab60a1e --- /dev/null +++ b/magefile.go @@ -0,0 +1,230 @@ +// +build mage + +package main + +import ( + "bytes" + "errors" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" + + "github.com/magefile/mage/mg" + "github.com/magefile/mage/sh" +) + +const ( + packageName = "github.com/gohugoio/hugo" + noGitLdflags = "-X $PACKAGE/hugolib.BuildDate=$BUILD_DATE" +) + +var ldflags = "-X $PACKAGE/hugolib.CommitHash=$COMMIT_HASH -X $PACKAGE/hugolib.BuildDate=$BUILD_DATE" + +// allow user to override go executable by running as GOEXE=xxx make ... on unix-like systems +var goexe = "go" + +func init() { + if exe := os.Getenv("GOEXE"); exe != "" { + goexe = exe + } +} + +func govendor() error { + return sh.Run(goexe, "get", "github.com/kardianos/govendor") +} + +// Install govendor and sync Hugo's vendored dependencies +func Vendor() error { + mg.Deps(govendor) + return sh.Run("govendor", "sync", packageName) +} + +// Build hugo binary +func Hugo() error { + mg.Deps(Vendor) + return sh.RunWith(flagEnv(), goexe, "build", "-ldflags", ldflags, packageName) +} + +// Build hugo binary with race detector enabled +func HugoRace() error { + mg.Deps(Vendor) + return sh.RunWith(flagEnv(), goexe, "build", "-race", "-ldflags", ldflags, packageName) +} + +// Install hugo binary +func Install() error { + mg.Deps(Vendor) + return sh.RunWith(flagEnv(), goexe, "install", "-ldflags", ldflags, packageName) +} + +func flagEnv() map[string]string { + hash, _ := sh.Output("git", "rev-parse", "--short", "HEAD") + return map[string]string{ + "PACKAGE": packageName, + "COMMIT_HASH": hash, + "BUILD_DATE": time.Now().Format("2006-01-02T15:04:05Z0700"), + } +} + +// Build hugo without git info +func HugoNoGitInfo() { + ldflags = noGitLdflags + mg.Deps(Vendor, Hugo) +} + +var docker = sh.RunCmd("docker") + +// Build hugo Docker container +func Docker() error { + if err := docker("build", "-t", "hugo", "."); err != nil { + return err + } + // yes ignore errors here + docker("rm", "-f", "hugo-build") + if err := docker("run", "--name", "hugo-build", "hugo ls /go/bin"); err != nil { + return err + } + if err := docker("cp", "hugo-build:/go/bin/hugo", "."); err != nil { + return err + } + return docker("rm", "hugo-build") +} + +// Run tests and linters +func Check() { + mg.Deps(TestRace, Test386, Fmt, Vet) +} + +// Run tests in 32-bit mode +func Test386() error { + return sh.RunWith(map[string]string{"GOARCH": "386"}, "govendor", "test", "+local") +} + +// Run tests +func Test() error { + mg.Deps(govendor) + return sh.Run("govendor", "test", "+local") +} + +// Run tests with race detector +func TestRace() error { + mg.Deps(govendor) + return sh.Run("govendor", "test", "-race", "+local") +} + +// Run gofmt linter +func Fmt() error { + pkgs, err := hugoPackages() + if err != nil { + return err + } + failed := false + for _, pkg := range pkgs { + files, err := filepath.Glob(filepath.Join(pkg, "*.go")) + if err != nil { + return nil + } + for _, f := range files { + if err := sh.Run("gofmt", "-l", f); err != nil { + failed = false + } + } + } + if failed { + return errors.New("improperly formatted go files") + } + return nil +} + +var pkgPrefixLen = len("github.com/gohugoio/hugo") + +func hugoPackages() ([]string, error) { + mg.Deps(govendor) + s, err := sh.Output("govendor", "list", "-no-status", "+local") + if err != nil { + return nil, err + } + pkgs := strings.Split(s, "\n") + for i := range pkgs { + pkgs[i] = "." + pkgs[i][pkgPrefixLen:] + } + return pkgs, nil +} + +// Run golint linter +func Lint() error { + pkgs, err := hugoPackages() + if err != nil { + return err + } + failed := false + for _, pkg := range pkgs { + if _, err := sh.Exec(nil, os.Stderr, os.Stderr, "golint", "-set_exit_status", pkg); err != nil { + failed = true + } + } + if failed { + return errors.New("golint errors!") + } + return nil +} + +// Run go vet linter +func Vet() error { + mg.Deps(govendor) + if err := sh.Run("govendor", "vet", "+local"); err != nil { + return errors.New("go vet errors!") + } + return nil +} + +// Generate test coverage report +func TestCoverHTML() error { + mg.Deps(govendor) + const ( + coverAll = "coverage-all.out" + cover = "coverage.out" + ) + f, err := os.Create(coverAll) + if err != nil { + return err + } + defer f.Close() + if _, err := f.Write([]byte("mode: count")); err != nil { + return err + } + pkgs, err := hugoPackages() + if err != nil { + return err + } + for _, pkg := range pkgs { + if err := sh.Run("govendor", "test", "-coverprofile="+cover, "-covermode=count", pkg); err != nil { + return err + } + b, err := ioutil.ReadFile(cover) + if err != nil { + return err + } + idx := bytes.Index(b, []byte{'\n'}) + b = b[idx+1:] + if _, err := f.Write(b); err != nil { + return err + } + } + if err := f.Close(); err != nil { + return err + } + return sh.Run(goexe, "tool", "cover", "-html="+coverAll) +} + +// Verify that vendored packages match git HEAD +func CheckVendor() error { + if err := sh.Run("git", "diff-index", "--quiet", "HEAD", "vendor/"); err != nil { + // yes, ignore errors from this, not much we can do. + sh.Exec(nil, os.Stdout, os.Stderr, "git", "diff", "vendor/") + return errors.New("check-vendor target failed: vendored packages out of sync") + } + return nil +} |