diff --git a/README.md b/README.md index 021bc3c..3057de4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ That is why I wrote a tool which parses Terraform configurations and updates all - Update version constraints of Terraform core and providers - Update all your Terraform configurations recursively under a given directory -- Get the latest release version from GitHub Release +- Get the latest release version automatically from GitHub Release # Supported Terraform version @@ -84,7 +84,13 @@ If you want to update all your Terraform configurations under the current direct run a command like this: ``` -$ tfupdate terraform -v 0.12.8 ./ -r +$ tfupdate terraform -v 0.12.8 -r ./ +``` + +If the version is omitted, the latest version is automatically checked and set. + +``` +$ tfupdate terraform -r ./ ``` # Usage @@ -107,7 +113,8 @@ Arguments PATH A path of file or directory to update Options: - -v --version A new version constraint + -v --version A new version constraint (default: latest) + If the version is omitted, the latest version is automatically checked and set. -r --recursive Check a directory recursively (default: false) -i --ignore-path A regular expression for path to ignore If you want to ignore multiple directories, set the flag multiple times. @@ -122,7 +129,10 @@ Arguments PATH A path of file or directory to update Options: - -v --version A new version constraint + -v --version A new version constraint (default: latest) + If the version is omitted, the latest version is automatically checked and set. + Getting the latest version automatically is supported only for official providers. + If you have an unofficial provider, use release latest command. -r --recursive Check a directory recursively (default: false) -i --ignore-path A regular expression for path to ignore If you want to ignore multiple directories, set the flag multiple times. diff --git a/command/provider.go b/command/provider.go index 500e39d..049b815 100644 --- a/command/provider.go +++ b/command/provider.go @@ -2,8 +2,10 @@ package command import ( "fmt" + "log" "strings" + "github.com/minamijoyo/tfupdate/release" "github.com/minamijoyo/tfupdate/tfupdate" flag "github.com/spf13/pflag" ) @@ -39,7 +41,23 @@ func (c *ProviderCommand) Run(args []string) int { c.name = cmdFlags.Arg(0) c.path = cmdFlags.Arg(1) - option, err := tfupdate.NewOption("provider", c.name, c.version, c.recursive, c.ignorePaths) + v := c.version + if v == "latest" { + r, err := release.NewOfficialProviderRelease(c.name) + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + v, err = r.Latest() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + } + + log.Printf("[INFO] Update provider %s to %s", c.name, v) + option, err := tfupdate.NewOption("provider", c.name, v, c.recursive, c.ignorePaths) if err != nil { c.UI.Error(err.Error()) return 1 @@ -64,7 +82,10 @@ Arguments PATH A path of file or directory to update Options: - -v --version A new version constraint + -v --version A new version constraint (default: latest) + If the version is omitted, the latest version is automatically checked and set. + Getting the latest version automatically is supported only for official providers. + If you have an unofficial provider, use release latest command. -r --recursive Check a directory recursively (default: false) -i --ignore-path A regular expression for path to ignore If you want to ignore multiple directories, set the flag multiple times. diff --git a/command/terraform.go b/command/terraform.go index ed888c3..50b0798 100644 --- a/command/terraform.go +++ b/command/terraform.go @@ -2,8 +2,10 @@ package command import ( "fmt" + "log" "strings" + "github.com/minamijoyo/tfupdate/release" "github.com/minamijoyo/tfupdate/tfupdate" flag "github.com/spf13/pflag" ) @@ -37,7 +39,23 @@ func (c *TerraformCommand) Run(args []string) int { c.path = cmdFlags.Arg(0) - option, err := tfupdate.NewOption("terraform", "", c.version, c.recursive, c.ignorePaths) + v := c.version + if v == "latest" { + r, err := release.NewTerraformRelease() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + v, err = r.Latest() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + } + + log.Printf("[INFO] Update terraform to %s", v) + option, err := tfupdate.NewOption("terraform", "", v, c.recursive, c.ignorePaths) if err != nil { c.UI.Error(err.Error()) return 1 @@ -61,7 +79,8 @@ Arguments PATH A path of file or directory to update Options: - -v --version A new version constraint + -v --version A new version constraint (default: latest) + If the version is omitted, the latest version is automatically checked and set. -r --recursive Check a directory recursively (default: false) -i --ignore-path A regular expression for path to ignore If you want to ignore multiple directories, set the flag multiple times. diff --git a/release/provider.go b/release/provider.go new file mode 100644 index 0000000..742634c --- /dev/null +++ b/release/provider.go @@ -0,0 +1,27 @@ +package release + +import "fmt" + +// OfficialProviderRelease is a release implementation which provides version information with GitHub Release. +type OfficialProviderRelease struct { + gh *GitHubRelease +} + +// NewOfficialProviderRelease is a factory method which returns an OfficialProviderRelease instance. +func NewOfficialProviderRelease(name string) (Release, error) { + owner := "terraform-providers" + repo := fmt.Sprintf("terraform-provider-%s", name) + r, err := NewGitHubRelease(owner, repo) + if err != nil { + return nil, err + } + + return &OfficialProviderRelease{ + gh: r.(*GitHubRelease), + }, nil +} + +// Latest returns a latest version. +func (r *OfficialProviderRelease) Latest() (string, error) { + return r.gh.Latest() +} diff --git a/release/terraform.go b/release/terraform.go new file mode 100644 index 0000000..730e9d9 --- /dev/null +++ b/release/terraform.go @@ -0,0 +1,23 @@ +package release + +// TerraformRelease is a release implementation which provides version information with GitHub Release. +type TerraformRelease struct { + gh *GitHubRelease +} + +// NewTerraformRelease is a factory method which returns an TerraformRelease instance. +func NewTerraformRelease() (Release, error) { + r, err := NewGitHubRelease("hashicorp", "terraform") + if err != nil { + return nil, err + } + + return &TerraformRelease{ + gh: r.(*GitHubRelease), + }, nil +} + +// Latest returns a latest version. +func (r *TerraformRelease) Latest() (string, error) { + return r.gh.Latest() +}