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 }