github.com/tonto/cli@v0.0.0-20180104210444-aec958fa47db/bump.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/coreos/go-semver/semver"
     9  	bumper "github.com/giantswarm/semver-bump/bump"
    10  	"github.com/giantswarm/semver-bump/storage"
    11  	"github.com/urfave/cli"
    12  )
    13  
    14  type VType int
    15  
    16  const (
    17  	Patch VType = iota
    18  	Minor
    19  	Major
    20  )
    21  
    22  var (
    23  	initialVersion = "0.0.1"
    24  )
    25  
    26  func bump() cli.Command {
    27  	cmd := bumpcmd{}
    28  	flags := append([]cli.Flag{}, cmd.flags()...)
    29  	return cli.Command{
    30  		Name:   "bump",
    31  		Usage:  "bump function version",
    32  		Flags:  flags,
    33  		Action: cmd.bump,
    34  	}
    35  }
    36  
    37  type bumpcmd struct {
    38  	verbose bool
    39  	major   bool
    40  	minor   bool
    41  }
    42  
    43  func (b *bumpcmd) flags() []cli.Flag {
    44  	return []cli.Flag{
    45  		cli.BoolFlag{
    46  			Name:        "major",
    47  			Usage:       "bumps major version",
    48  			Destination: &b.major,
    49  		},
    50  		cli.BoolFlag{
    51  			Name:        "minor",
    52  			Usage:       "bumps minor version",
    53  			Destination: &b.minor,
    54  		},
    55  		cli.BoolFlag{
    56  			Name:        "verbose, v",
    57  			Usage:       "verbose mode",
    58  			Destination: &b.verbose,
    59  		},
    60  	}
    61  }
    62  
    63  // bump will take the found valid function and bump its version
    64  func (b *bumpcmd) bump(c *cli.Context) error {
    65  	var t VType
    66  	if b.major {
    67  		t = Major
    68  	} else if b.minor {
    69  		t = Minor
    70  	} else {
    71  		t = Patch
    72  	}
    73  
    74  	wd, err := os.Getwd()
    75  	if err != nil {
    76  		return err
    77  	}
    78  	_, err = bumpItWd(wd, t)
    79  	return err
    80  }
    81  func bumpItWd(wd string, vtype VType) (*funcfile, error) {
    82  	fn, err := findFuncfile(wd)
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  	return bumpIt(fn, vtype)
    87  }
    88  
    89  // returns updated funcfile
    90  func bumpIt(fpath string, vtype VType) (*funcfile, error) {
    91  	// fmt.Println("Bumping version in func file at: ", fpath)
    92  	funcfile, err := parseFuncfile(fpath)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	funcfile, err = bumpVersion(funcfile, vtype)
    98  	if err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	if err := storeFuncfile(fpath, funcfile); err != nil {
   103  		return nil, err
   104  	}
   105  	fmt.Println("Bumped to version", funcfile.Version)
   106  	return funcfile, nil
   107  }
   108  
   109  func bumpVersion(funcfile *funcfile, t VType) (*funcfile, error) {
   110  	funcfile.Name = cleanImageName(funcfile.Name)
   111  	if funcfile.Version == "" {
   112  		funcfile.Version = initialVersion
   113  		return funcfile, nil
   114  	}
   115  
   116  	s, err := storage.NewVersionStorage("local", funcfile.Version)
   117  	if err != nil {
   118  		return nil, err
   119  	}
   120  
   121  	version := bumper.NewSemverBumper(s, "")
   122  	var newver *semver.Version
   123  	if t == Major {
   124  		newver, err = version.BumpMajorVersion("", "")
   125  	} else if t == Minor {
   126  		newver, err = version.BumpMinorVersion("", "")
   127  	} else {
   128  		newver, err = version.BumpPatchVersion("", "")
   129  	}
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  
   134  	funcfile.Version = newver.String()
   135  	return funcfile, nil
   136  }
   137  
   138  func cleanImageName(name string) string {
   139  	if i := strings.Index(name, ":"); i != -1 {
   140  		name = name[:i]
   141  	}
   142  
   143  	return name
   144  }