diff --git a/go.mod b/go.mod index e0c1042..d4a5c31 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,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 c457fe0..5271195 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/aws/aws-sdk-go v0.0.0-20190104231327-923b7b1b0525 h1:qc2jx43HwaJSlY5U github.com/aws/aws-sdk-go v0.0.0-20190104231327-923b7b1b0525/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/iamy.go b/iamy.go index 6a3b970..333ef78 100644 --- a/iamy.go +++ b/iamy.go @@ -1,18 +1,25 @@ package main import ( + "fmt" "io/ioutil" "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 } @@ -60,6 +67,8 @@ func main() { log.SetOutput(ioutil.Discard) } + performVersionChecks() + switch cmd { case push.FullCommand(): PushCommand(ui, PushCommandInput{ @@ -85,3 +94,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`) + 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) + } + } + } +}