github.com/aserto-dev/calc-version@v1.1.4/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"os"
     7  
     8  	"github.com/pkg/errors"
     9  	"github.com/spf13/cobra"
    10  )
    11  
    12  var (
    13  	flagNext       = ""
    14  	flagMajorOnly  = false
    15  	flagMinorOnly  = false
    16  	flagPreRelease = ""
    17  
    18  	flagTagsServerURL = ""
    19  	flagTagsUsername  = ""
    20  	flagTagsPassword  = ""
    21  )
    22  
    23  var rootCmd = &cobra.Command{
    24  	Use: "calc-version [flags]",
    25  	RunE: func(cmd *cobra.Command, args []string) error {
    26  		version, err := currentVersion()
    27  		if err != nil {
    28  			return err
    29  		}
    30  
    31  		if flagPreRelease != "" {
    32  			version = preRelease(version, flagPreRelease)
    33  		}
    34  
    35  		if flagNext != "" {
    36  			version, err = next(version, flagNext)
    37  			if err != nil {
    38  				return err
    39  			}
    40  		}
    41  
    42  		if flagMinorOnly && flagMajorOnly {
    43  			return errors.New("can't use --minor and --major in the same run")
    44  		}
    45  
    46  		if flagMinorOnly {
    47  			major, minor, _, tail, err := parts(version)
    48  			if err != nil {
    49  				return errors.Wrap(err, "failed to get version parts")
    50  			}
    51  			if tail != "" {
    52  				return errors.Errorf("'%s' is a development version - can't use the --minor flag", version)
    53  			}
    54  			version = fmt.Sprintf("%d.%d", major, minor)
    55  		}
    56  
    57  		if flagMajorOnly {
    58  			major, _, _, tail, err := parts(version)
    59  			if err != nil {
    60  				return errors.Wrap(err, "failed to get version parts")
    61  			}
    62  			if tail != "" {
    63  				return errors.Errorf("'%s' is a development version - can't use the --major flag", version)
    64  			}
    65  			version = fmt.Sprintf("%d", major)
    66  		}
    67  
    68  		fmt.Println(version)
    69  
    70  		return nil
    71  	},
    72  	SilenceErrors: true,
    73  	SilenceUsage:  true,
    74  }
    75  
    76  var versionCmd = &cobra.Command{
    77  	Use:   "version",
    78  	Short: "Print version and exit",
    79  	Run: func(cmd *cobra.Command, args []string) {
    80  		fmt.Printf("calc-version %s\n", GetInfo().String())
    81  	},
    82  	SilenceErrors: true,
    83  	SilenceUsage:  true,
    84  }
    85  
    86  var tagsCmd = &cobra.Command{
    87  	Use:   "tags <flags> [image]",
    88  	Short: "Prints the tags that should be pushed to a docker registry",
    89  	Long: `Connects to a docker registry and lists all tags for an image.
    90  Depending on whether the current version is a development version and if
    91  it's the latest one, it returns the appropriate tags to be pushed.`,
    92  	Args: cobra.ExactArgs(1),
    93  	RunE: func(cmd *cobra.Command, args []string) error {
    94  		version, err := currentVersion()
    95  		if err != nil {
    96  			return err
    97  		}
    98  
    99  		if flagPreRelease != "" {
   100  			version = preRelease(version, flagPreRelease)
   101  		}
   102  
   103  		serverURL, err := url.Parse(flagTagsServerURL)
   104  		if err != nil {
   105  			return err
   106  		}
   107  
   108  		host := flagTagsServerURL
   109  		if serverURL.Host != "" {
   110  			host = serverURL.Host
   111  		}
   112  
   113  		existingTags, err := imageTags(host+"/"+args[0], flagTagsUsername, flagTagsPassword)
   114  		if err != nil {
   115  			return err
   116  		}
   117  
   118  		tags, err := calculateTagsForVersion(version, existingTags)
   119  		if err != nil {
   120  			return err
   121  		}
   122  
   123  		for _, tag := range tags {
   124  			fmt.Println(tag)
   125  		}
   126  
   127  		return nil
   128  	},
   129  	SilenceErrors: true,
   130  	SilenceUsage:  true,
   131  }
   132  
   133  func main() {
   134  	rootCmd.Flags().StringVarP(&flagNext, "next", "n", "", "Prints the next version. Possible values are 'major', 'minor' or 'patch'.")
   135  	rootCmd.Flags().StringVarP(&flagPreRelease, "pre-release", "", os.ExpandEnv("${PRE_RELEASE}"), `Adds a pre release identifier to the version. (env "PRE_RELEASE")`)
   136  	rootCmd.Flags().BoolVarP(&flagMajorOnly, "major-only", "m", false, "Only prints the major version. Fails if version is a development version.")
   137  	rootCmd.Flags().BoolVarP(&flagMinorOnly, "minor-only", "r", false, "Only prints the major and minor versions. Fails if version is a development version.")
   138  
   139  	tagsCmd.Flags().StringVarP(&flagTagsServerURL, "server", "s", "https://registry-1.docker.io/", "Registry server to connect to.")
   140  	tagsCmd.Flags().StringVarP(&flagTagsUsername, "user", "u", "", "Username for the registry.")
   141  	tagsCmd.Flags().StringVarP(&flagTagsPassword, "password", "p", "", "Password for the registry.")
   142  	tagsCmd.Flags().StringVarP(&flagPreRelease, "pre-release", "", os.ExpandEnv("${PRE_RELEASE}"), `Adds a pre release identifier to the version. (env "PRE_RELEASE")`)
   143  
   144  	rootCmd.AddCommand(
   145  		versionCmd,
   146  		tagsCmd,
   147  	)
   148  
   149  	if err := rootCmd.Execute(); err != nil {
   150  		fmt.Println(err.Error())
   151  		os.Exit(1)
   152  	}
   153  }