...

Source file src/github.com/vbatts/tar-split/magefile.go

Documentation: github.com/vbatts/tar-split

     1  //go:build mage
     2  // +build mage
     3  
     4  package main
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"os"
    10  	"os/exec"
    11  	"time"
    12  
    13  	"github.com/magefile/mage/mg" // mg contains helpful utility functions, like Deps
    14  )
    15  
    16  var (
    17  	// Default target to run when none is specified
    18  	// If not set, running mage will list available targets
    19  	Default        = Build
    20  	app     string = "tar-split"
    21  	Stdout         = ourStdout
    22  	Stderr         = ourStderr
    23  
    24  	golangcilintVersion = "v1.51.2"
    25  
    26  	cleanFiles = []string{}
    27  )
    28  
    29  // Run all-the-things
    30  func All() error {
    31  	mg.Deps(Vet)
    32  	mg.Deps(Test)
    33  	mg.Deps(Build)
    34  	mg.Deps(Lint)
    35  	return nil
    36  }
    37  
    38  // A build step that requires additional params, or platform specific steps for example
    39  func Build() error {
    40  	mg.Deps(InstallDeps)
    41  	fmt.Println("Building...")
    42  	cmd := exec.Command("go", "build", "-v", "-o", app, "./cmd/tar-split")
    43  	cmd.Stdout = Stdout
    44  	cmd.Stderr = Stderr
    45  	return cmd.Run()
    46  }
    47  
    48  // Vet the codes
    49  func Vet() error {
    50  	fmt.Println("go vet...")
    51  	cmd := exec.Command("go", "vet", "./...")
    52  	cmd.Stdout = Stdout
    53  	cmd.Stderr = Stderr
    54  	return cmd.Run()
    55  }
    56  
    57  // Run the Linters
    58  func Lint() error {
    59  	mg.Deps(InstallToolsLint)
    60  	fmt.Println("Linting...")
    61  	cmd := exec.Command("golangci-lint", "run")
    62  	cmd.Stdout = Stdout
    63  	cmd.Stderr = Stderr
    64  	return cmd.Run()
    65  }
    66  
    67  // Run the tests available
    68  func Test() error {
    69  	fmt.Println("Testing...")
    70  	cmd := exec.Command("go", "test", "-cover", "-v", "-bench", "'.'", "-benchmem", "./...")
    71  	cmd.Stdout = Stdout
    72  	cmd.Stderr = Stderr
    73  	return cmd.Run()
    74  }
    75  
    76  // A custom install step if you need your bin someplace other than go/bin
    77  func Install() error {
    78  	mg.Deps(Build)
    79  	fmt.Println("Installing...")
    80  	return os.Rename(app, "/usr/local/bin/"+app)
    81  }
    82  
    83  func init() {
    84  	cleanFiles = append(cleanFiles, ".install.deps") // sloppy
    85  }
    86  
    87  // Manage your deps, or running package managers.
    88  func InstallDeps() error {
    89  	const fpath = ".install.deps"
    90  	success := false
    91  	defer func() {
    92  		if success {
    93  			fd, err := os.Create(fpath)
    94  			if err != nil {
    95  				fmt.Fprintln(os.Stderr, err)
    96  			}
    97  			fd.Close()
    98  		}
    99  	}()
   100  	if IsFresh(fpath, time.Now()) {
   101  		return nil
   102  	}
   103  
   104  	mg.Deps(Tidy)
   105  	fmt.Println("Installing Deps...")
   106  	cmd := exec.Command("go", "get", "./...")
   107  	cmd.Stdout = Stdout
   108  	cmd.Stderr = Stderr
   109  	err := cmd.Run()
   110  	if err != nil {
   111  		return err
   112  	}
   113  	success = true
   114  	return nil
   115  }
   116  
   117  // Tools used during build/dev/test
   118  func InstallTools() error {
   119  	mg.Deps(InstallToolsLint)
   120  	return nil
   121  }
   122  
   123  func InstallToolsLint() error {
   124  	fmt.Println("Installing Deps...")
   125  	cmd := exec.Command("go", "install", "github.com/golangci/golangci-lint/cmd/golangci-lint@"+golangcilintVersion)
   126  	cmd.Stdout = Stdout
   127  	cmd.Stderr = Stderr
   128  	return cmd.Run()
   129  }
   130  
   131  // Tidy go modules
   132  func Tidy() error {
   133  	fmt.Println("Tidy up...")
   134  	cmd := exec.Command("go", "mod", "tidy")
   135  	cmd.Stdout = Stdout
   136  	cmd.Stderr = Stderr
   137  	return cmd.Run()
   138  }
   139  
   140  // Clean up after yourself
   141  func Clean() {
   142  	fmt.Println("Cleaning...")
   143  	os.RemoveAll(app)
   144  	for _, fpath := range cleanFiles {
   145  		os.RemoveAll(fpath)
   146  	}
   147  }
   148  
   149  // IsFresh checks if `fpath` exists (therefore `false`, it is not fresh) or if
   150  // `fpath` is _newer_ than `t` (true, as in it's freshly built)
   151  func IsFresh(fpath string, t time.Time) bool {
   152  	fi, err := os.Stat(fpath)
   153  	if err != nil && errors.Is(err, os.ErrNotExist) {
   154  		return false
   155  	}
   156  	return fi.ModTime().Before(t)
   157  }
   158  

View as plain text