1
1
package cmd
2
2
3
3
import (
4
+ "context"
5
+ "errors"
4
6
"fmt"
5
7
"log"
6
8
9
+ "github.com/google/go-github/v35/github"
10
+ "github.com/hashicorp/go-version"
7
11
"github.com/spf13/afero"
8
12
"github.com/terraform-linters/tflint/plugin"
9
13
"github.com/terraform-linters/tflint/tflint"
@@ -12,6 +16,8 @@ import (
12
16
func (cli * CLI ) printVersion (opts Options ) int {
13
17
fmt .Fprintf (cli .outStream , "TFLint version %s\n " , tflint .Version )
14
18
19
+ cli .printLatestReleaseVersion ()
20
+
15
21
workingDirs , err := findWorkingDirs (opts )
16
22
if err != nil {
17
23
cli .formatter .Print (tflint.Issues {}, fmt .Errorf ("Failed to find workspaces; %w" , err ), map [string ][]byte {})
@@ -81,3 +87,35 @@ func getPluginVersions(opts Options) []string {
81
87
82
88
return versions
83
89
}
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
+ compare := tflint .Version .Compare (latestVersion )
100
+ if compare < 0 {
101
+ fmt .Fprintf (cli .outStream , "New version available: %s\n " , * latest .HTMLURL )
102
+ }
103
+ }
104
+
105
+ func getLatestVersion () (* github.RepositoryRelease , error ) {
106
+ ghClient := github .NewClient (nil )
107
+ releases , _ , err := ghClient .Repositories .ListReleases (context .Background (),
108
+ "terraform-linters" , "tflint" , & github.ListOptions {})
109
+ if err != nil {
110
+ return nil , err
111
+ }
112
+
113
+ // GitHub sorts releases results. Select first non-prerelease version and return it.
114
+ for i := range releases {
115
+ release := releases [i ]
116
+ if ! * release .Prerelease {
117
+ return release , nil
118
+ }
119
+ }
120
+ return nil , errors .New ("not found" )
121
+ }
0 commit comments