diff --git a/go.mod b/go.mod index 3a6943e..eede542 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect github.com/aws/aws-sdk-go v1.16.23 + github.com/blang/semver v3.5.1+incompatible github.com/davecgh/go-spew v1.1.1 // indirect github.com/fatih/color v1.7.0 github.com/ghodss/yaml v1.0.0 diff --git a/go.sum b/go.sum index 7ddc201..e1bc504 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZq github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aws/aws-sdk-go v1.16.23 h1:MwBOBeez0XEFVh6DCc888X+nHVBCjUDLnnWXSGGWUgM= github.com/aws/aws-sdk-go v1.16.23/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/iamy.go b/iamy.go index 0814e13..a17ac47 100644 --- a/iamy.go +++ b/iamy.go @@ -5,14 +5,20 @@ import ( "log" "os" "path/filepath" + "regexp" + "github.com/blang/semver" "gopkg.in/alecthomas/kingpin.v2" ) +const versionTooOldError = `Your version of IAMy (%s) is out of date compared to what the local +project expects. You should upgrade to %s to use this project.` + var ( - Version string = "dev" - defaultDir string - dryRun *bool + Version string = "dev" + defaultDir string + dryRun *bool + versionFileName string = ".iamy-version" ) type logWriter struct{ *log.Logger } @@ -61,6 +67,8 @@ func main() { log.SetOutput(ioutil.Discard) } + performVersionChecks() + switch cmd { case push.FullCommand(): PushCommand(ui, PushCommandInput{ @@ -87,3 +95,29 @@ func init() { } defaultDir = filepath.Clean(dir) } + +func performVersionChecks() { + currentIAMyVersion, _ := semver.Make(Version) + log.Printf("current version is %s", currentIAMyVersion) + + if _, err := os.Stat(versionFileName); !os.IsNotExist(err) { + log.Printf("%s found", versionFileName) + fileBytes, _ := ioutil.ReadFile(versionFileName) + fileContents := string(fileBytes) + + if fileContents != "" { + re := regexp.MustCompile(`\d\.\d+\.\d(\+\w+)?`) + match := re.FindStringSubmatch(fileContents) + localDesiredVersion, _ := semver.Make(match[0]) + log.Printf("local project wants version %s", localDesiredVersion) + + // We don't want to notify users if the `Version` is "dev" as it's not + // actually too old. It could be that they are running non-released + // versions. + if Version != "dev" && currentIAMyVersion.LE(localDesiredVersion) { + fmt.Printf(versionTooOldError, currentIAMyVersion, localDesiredVersion) + os.Exit(1) + } + } + } +}