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,38 @@ 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
+ 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