Skip to content

Commit cc98764

Browse files
committed
Add remote version check
1 parent 34f8af8 commit cc98764

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

cmd/version.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package cmd
22

33
import (
4+
"context"
5+
"errors"
46
"fmt"
57
"log"
68

9+
"github.com/google/go-github/v35/github"
10+
"github.com/hashicorp/go-version"
711
"github.com/spf13/afero"
812
"github.com/terraform-linters/tflint/plugin"
913
"github.com/terraform-linters/tflint/tflint"
@@ -12,6 +16,8 @@ import (
1216
func (cli *CLI) printVersion(opts Options) int {
1317
fmt.Fprintf(cli.outStream, "TFLint version %s\n", tflint.Version)
1418

19+
cli.printLatestReleaseVersion()
20+
1521
workingDirs, err := findWorkingDirs(opts)
1622
if err != nil {
1723
cli.formatter.Print(tflint.Issues{}, fmt.Errorf("Failed to find workspaces; %w", err), map[string][]byte{})
@@ -81,3 +87,38 @@ func getPluginVersions(opts Options) []string {
8187

8288
return versions
8389
}
90+
91+
// Checks GitHub releases and prints new version, if current version is outdated.
92+
// requires GitHub releases to follow semver.
93+
func (cli *CLI) printLatestReleaseVersion() {
94+
latest, err := getLatestVersion()
95+
if err != nil {
96+
cli.formatter.Print(tflint.Issues{}, fmt.Errorf("Failed to check updates; %w", err), map[string][]byte{})
97+
}
98+
latestVersion, err := version.NewSemver(*latest.Name)
99+
if err != nil {
100+
cli.formatter.Print(tflint.Issues{}, fmt.Errorf("Failed to parse version; %w", err), map[string][]byte{})
101+
}
102+
compare := tflint.Version.Compare(latestVersion)
103+
if compare < 0 {
104+
fmt.Fprintf(cli.outStream, "New version available: %s\n", *latest.HTMLURL)
105+
}
106+
}
107+
108+
func getLatestVersion() (*github.RepositoryRelease, error) {
109+
ghClient := github.NewClient(nil)
110+
releases, _, err := ghClient.Repositories.ListReleases(context.Background(),
111+
"terraform-linters", "tflint", &github.ListOptions{})
112+
if err != nil {
113+
return nil, err
114+
}
115+
116+
// GitHub sorts releases results. Select first non-prerelease version and return it.
117+
for i := range releases {
118+
release := releases[i]
119+
if !*release.Prerelease {
120+
return release, nil
121+
}
122+
}
123+
return nil, errors.New("not found")
124+
}

0 commit comments

Comments
 (0)